如何替换 QueryString 中 JSON 包装中与特定键匹配的值?

How can I replace values matching a certain key in a JSON wrap in a QueryString?

我有:

queryString=`key_value="something"&type_name=user&value={"password":"Test1234"}&key_attribute=guid`

我想用[HIDDEN]替换Test1234password

如果你在节点中,你可以只解析然后字符串化查询字符串

var qs=require("querystring")
var temp=qs.parse(queryString)
var user=JSON.parse(temp.value)
user.password='[HIDDEN]'
temp.value=JSON.stringify(user)
queryString=qs.stringify(temp)

Browserify 也有查询字符串实现,但您还想使用正则表达式

实现这一目标的一种方法是:

let queryString=`key_value="something"&type_name=user&value={"password":"Test1234"}&key_attribute=guid`

let modifiedString = queryString.replace(/("password":)"[\w]+"/, '"[HIDDEN]"')

console.log(modifiedString)

使用对象的URLSearchParams interface to create an iterable object out of the query string. Select the value you want to edit with the get()方法,使用JSON.parse将值解析为对象。

现在您拥有作为对象的值,您可以从中更新 password 属性.

的值

使用set()方法覆盖查询字符串的value条目并将对象字符串化回JSON.

使用 toString() 方法将 URLSearchParams 对象变回字符串。

const queryString=`key_value="something"&type_name=user&value={"password":"Test1234"}&key_attribute=guid`;
const params = new URLSearchParams(queryString);
const value = params.get('value');
const objectValue = JSON.parse(value);

objectValue.password = '[HIDDEN]';
params.set('value', JSON.stringify(objectValue));

const updatedQueryString = params.toString();
console.log(updatedQueryString);

虽然有很多包可以用来解决这个问题,但我建议学习如何解决原始问题

以下解决方案将有助于理解如何制作东西

const queryString = `key_value="something"&type_name=user&value={"password":"Test1234"}&key_attribute=guid`;


// SOLUTION 1
// convert string to object, change key, and convert back to string
const jsonString = queryString
  .split('&')
  .reduce((acc, next) => {
    const [key, value] = next.split('=');
    acc[key] = value.indexOf('{') === 0 ? JSON.parse(value) : value;
    return acc
  }, {})

jsonString.value.password = '[HIDDEN]'

const solution1 = Object.keys(jsonString).map(key => {
  const val = typeof jsonString[key] === 'object' ? JSON.stringify(jsonString[key]) : jsonString[key]
  return `${key}=${val}`

}).join('&')



// SOLUTION 2
// Simply replace by regex using strict parameter
const solution2 = queryString.replace(/&value={"password":"(\w+)"}&/gi, '[HIDDEN]')

console.log('Using JSON.parse:', solution1)
console.log('Using regex:', solution2)