如何通过JSON的replacer函数对对象进行字符串化?

2024-04-05

这是我的代码:

BAD = {
          "a": "2",
          "b": 1,
          "c": "Nexus",
          "d": "Alligator",
          "e": 5,
          "f": 1431807036,
          "g": {
                    "2": {
                            "w": 17,
                            "b": 5
                         }
               }
      }

console.log(JSON.stringify(BAD, ['a', 'b', 'c', 'd', 'e', 'g']));

http://jsfiddle.net/whv7x6xc/1/ http://jsfiddle.net/whv7x6xc/1/

按键a, b, c, d, e, and g是唯一被字符串化的,这很好,但有一个问题。它忽略分配给的对象g.

但是,如果你这样做:console.log(JSON.stringify(BAD));它显示了正确的字符串化版本。

Edit: w and b不过,它们是动态的并且会定期变化(来来去去),所以我不能只是将它们硬编码进去。


JSON 替换器是递归的。这意味着它使用相同的数组all它遇到的物体。换句话说,它使用相同的值来映射BAD.g的值。自从,Bad.g的值没有任何与您提供的键匹配的键,因此不会正确映射任何内容。这意味着我们必须将“2”添加到您的数组中。现在“2”也有一个具有不同键的对象。我们已经考虑了“b”,所以现在我们只需将“w”添加到数组中即可。

当向替换器提供数组时,最好将该数组视为以下内容的列表:all您想要映射的键。

DEMO: http://jsfiddle.net/dirtyd77/whv7x6xc/4/ http://jsfiddle.net/dirtyd77/whv7x6xc/4/

console.log(JSON.stringify(BAD, ['a', 'b', 'c', 'd', 'e', 'g', '2', 'w']));

希望这对您有所帮助,如果您有任何疑问,请告诉我。


这也是摘录自的一个片段文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#The_replacer_parameter,

如果返回任何其他对象,则该对象会递归地字符串化为 JSON 字符串,对每个属性调用替换函数,除非该对象是函数,在这种情况下,不会向 JSON 字符串添加任何内容。


对于动态键,您始终可以创建一个函数来推送到数组并将该数组用于白名单。这是一个例子:

DEMO: http://jsfiddle.net/dirtyd77/whv7x6xc/5/ http://jsfiddle.net/dirtyd77/whv7x6xc/5/

var BAD = {
    "a": "2",
    "b": 1,
    "c": "Nexus",
    "d": "Alligator",
    "e": 5,
    "f": 1431807036,
    "g": {
        "2": {
            "w": 17,
            "b": 5
        }
    }
}

var whitelist = [];

iterate(BAD);

console.log(whitelist, JSON.stringify(BAD, whitelist));

function iterate(obj){
    for(var key in obj){
        // may have to do some checking to ignore any keys you don't care about
        whitelist.push(key);
        // if value is an object, will use this same function to push to whitelist array
        if(typeof obj[key] === 'object'){
            return iterate(obj[key]);
        }
    }
}

您也可以只使用现有的whitelist只需将密钥附加到您的g键(假设不是动态的):

DEMO: http://jsfiddle.net/dirtyd77/whv7x6xc/6/ http://jsfiddle.net/dirtyd77/whv7x6xc/6/

var whitelist = ['a', 'b', 'c', 'd', 'e', 'g'];

iterate(BAD.g);

console.log(whitelist, JSON.stringify(BAD, whitelist));

function iterate(obj){
    for(var key in obj){
        whitelist.push(key);
        if(typeof obj[key] === 'object'){
            return iterate(obj[key]);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过JSON的replacer函数对对象进行字符串化? 的相关文章

随机推荐