【问题标题】:JSON stringify objects with json strings already as valuesJSON stringify 已将 json 字符串作为值的对象
【发布时间】:2017-11-13 17:33:10
【问题描述】:

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

例如:

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

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

除了用 JSON 字符串解析每个值并对对象进行字符串化之外,是否有任何干净整洁的解决方案?

【问题讨论】:

  • 唯一干净的方法是首先避免混合 JSON 和 JavaScript 对象。
  • 我很好奇你最初是如何在 JSON 结构中得到一个转义的 JSON 字符串的。理想情况下,obj.options 应该是 JSON 对象,而不是当前情况下的字符串。不幸的是,如果您无法更改它,但您知道哪些属性是 JSON,哪些不是,您可以在属性上使用 JSON.parse(),替换字符串值,然后调用 JSON.stringify()
  • 您是否提前知道对象的哪些属性包含字符串化的 JSON?
  • @KevinLH 我正在从 node.js 上的旧关系数据库中检索一些数据,该数据库在几列中有 JSON 字符串作为值。我知道我可以解析每个 JSON 字符串,然后对整个对象进行字符串化,但我很好奇是否还有其他更简单的解决方案。
  • 一个值不能成为属性。 所以即使你替换所有的\ ,选项的值也只是一个字符串值。要将options 中的值作为主要obj 的一部分,您必须亲自处理它(通过将其解析为JSON)。

标签: javascript json parsing object stringify


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你可以这样做

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

    【讨论】:

    • 我在“没有解析”的问题中写了
    • 请同时阅读接受的答案。没有 json.parse 就无法解析。
    【解决方案3】:

    在这种情况下,您需要先将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 一次。

    【讨论】:

    • "to JSON" — from 不是 to
    【解决方案4】:

    假设您不知道哪些属性是 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);

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 2020-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多