这是我的代码:

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/

abcdeg是唯一被字符串化的键,这很好,但有一个问题。 它忽略了分配给g的对象。

在此输入图像描述

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

编辑: wb和动态,并定期更改(来去),所以我不能只是硬编码。

===============>>#1 票数:7 已采纳

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

在为replacer提供数组时,最好将数组视为要映射的所有键的列表。

演示: http//jsfiddle.net/dirtyd77/whv7x6xc/4/

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

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


这里也是文档的片段,

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


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

演示: 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键上附加键(假设不是动态的):

演示: 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]);
        }
    }
}

===============>>#2 票数:4

replacer参数很深,因为它会影响所有属性的字符串化,即使它们不在第一级。 如果向数组添加"2" ,您将看到该对象已字符串化,减去"w" ,因为"w"未被替换者列入白名单。

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

考虑一下为什么要使用replacer 如果您使用黑名单而不是白名单,那么通过传递函数而不是数组可能会更好。

JSON.stringify(BAD, function replacer(key, value) {
  var blacklist = ['b', 'g']
  return blacklist.indexOf(key) === -1 ? value : undefined
})

===============>>#3 票数:2

为参数添加两个键,例如:

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

产量

小提琴

  ask by NiCk Newman translate from so

未解决问题?本站智能推荐:

4回复

使用knex插入MySQL JSON列时自动对对象进行字符串化

让我们直接跳到示例代码: 我可以这样插入表格: 并从表中获取数据,如下所示: 插入行时,JSON列需要作为序列化字符串传递。 检索行时,将返回一个已解析的对象。 这在项目中造成了混乱。 我们正在使用TypeScript,并且希望插入的类型与选择的类型相同,但这使
4回复

根据上下文不同地对对象进行字符串化

我有一个带有toJSON方法的对象: 当我调用JSON.stringify(v)我会得到{foo:'zoom1'} -我的问题是-有没有一种方法可以根据谁调用JSON.stringify()来对其进行不同的字符串化,例如,如果我想要: 代替? dunno,也许有一个不错的设计模
3回复

在对对象进行字符串化时,JSON将元素节点转换为对象?

所以我正在做一个小小的个人项目,却遇到了一个问题。 我每天都需要容纳各种dom元素对象。 这些对象实例存储在一个数组中,然后需要将该数组存储到localStorage中以便以后加载。 问题是当我先执行JSON.stringify然后执行JSON.parse时,它将HTML节点转换为
2回复

JSON.stringify不对整个对象进行字符串化

JSON.stringify(this.workout)不能对整个对象进行字符串化。 workout是Workout类中的一个对象,看起来像这样: 练习和例程是另一个具有嵌套数组的类。 问题是JSON.stringify(this.workout)仅返回{"name":"Day
1回复

是否有一个函数将JSON与空格进行字符串化?

我知道JSON的空白很重要。 但是,仅用于调试输出,我想打印格式化的JSON对象,因此使用制表符和换行符。 JavaScript中是否有用于格式化JSON字符串化的函数?
2回复

如何对圆形JSON对象进行字符串化?

有内置方法可以对复杂的JSON对象进行字符串化吗? 每次我使用JSON.stringfy时,都会出现以下错误: 将圆形结构转换为JSON ,并且还需要其解析器 这是我的对象的图片http://imgur.com/s3HbdtQ
3回复

如何对对象数组进行字符串化处理?

我创建了一个对象数组,该对象需要存储并保存到另一个页面。 对象数组与此类似: 但是当我使用JSON.stringify()时,它不会对对象进行字符串化,而仅对数组进行字符串化。 所以我最终得到的数组看起来像这样: 那么如何在此数组中将这些对象字符串化。 编辑:此对
4回复

JSON使用json字符串将对象作为值进行字符串化

可能是一个重复的问题,但找不到答案。 我想将包含一些JSON字符串的javascript对象字符串化为值。 例如: 如您所见,键'options'的值是一个JSON字符串。 我想对对象'obj'进行字符串化,而不是对内部JSON字符串进行双重字符串化。 除了使用JSON字
1回复

尝试使用JSON对包含对象数组的对象进行字符串化

当尝试对包含对象数组的对象进行字符串化时,当看到具有值时,我得到的是一个空数组。 我想要的是使用类似: 我尝试过使用= {}作为补救措施,但在填充数组时,我仍然以ObjToString为空而告终。 它显示为: {"Expressions":[]} 如果我在VS的右侧部分进
3回复

JSON对象和字符串函数

我试图在JSON属性值上调用startsWith()字符串函数: {“消息”:“ xyzabc”} 但是我得到了错误: 对象xyzabc没有方法'startsWith' 我怎样才能做到这一点? 代码在服务器端运行,在Node.js上运行Express