JSON 将 json 个字符串作为值的对象进行字符串化

JSON stringify objects with json strings already as values

可能是重复的问题,但找不到答案。我想将包含一些 JSON 字符串作为值的 javascript 对象字符串化。

例如:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

如您所见,键 'options' 的值是一个 JSON 字符串。我想对对象 'obj' 进行字符串化,而不对内部 JSON 字符串进行双重字符串化。

除了使用 JSON 字符串解析每个值并将对象字符串化之外,是否有任何简洁明了的解决方案?

不,你不能那样做。
如果您没有对该字符串进行编码,JSON.parse 将不会 return 一个正确的字符串。

最干净的解决方案是将 JSON 用于 obj.options,并在需要时将其字符串化。

你可以这样做

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

var options  =JSON.parse(obj.options);

obj.options = options;

console.log(obj);

在这种情况下,您需要先将options解析为JSONObject。 您可以使用以下两种方法执行此操作:

方法一:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};
obj.options  = JSON.parse(obj.options);
console.log(JSON.stringify(obj));

方法二:

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

var result = JSON.stringify(obj, function(key, val) {
    if (key === "options"){
            return JSON.parse(val);
        }else{
            return val;
        }
});

console.log(result);

现在这将 stringify options 只有一次。

假设您不知道哪些属性是 JSON,您可以使用 JSON.stringify 上的 replacer 函数参数来检查值是否是 JSON 字符串。下面的示例尝试解析 try..catch 中的每个字符串,因此不是最有效的,但应该可以解决问题(在嵌套属性上也是如此)

var obj = {id:1, options:"{\"code\":3,\"type\":\"AES\"}"};

function checkVal(key,val){
 if(typeof val === 'string'){
  try{return JSON.parse(val);}catch(e){}
  }
  return val;
}

var res = JSON.stringify(obj,checkVal);

console.log('normal output', JSON.stringify(obj))
console.log('with replacer', res);