【问题标题】:Why does stringify() only return 1st level of object array为什么 stringify() 只返回第一级对象数组
【发布时间】:2019-08-31 23:56:38
【问题描述】:

我们正在根据一个简单的模板格式构建一个动态 JSON 负载,该模板指示我们的负载应该产生多少级别,例如"level1.level2" > 将产生:

{
  "level1": [
     {
       "level2": [
           {
              "someData": "willGoHere",
           },
           {
              "someOtherData": "willAlsoGoHere"
           }
       ]
     }
  ]
}

显然,我们正在使用不同的命名结构,例如:“client.ipcEvent.level3”,在某些情况下,我们正在测试 4 个级别。我们做错了〜我们能够构建我们的 javascript 对象,但无法使用 stringify() 创建完整的 result 因为出于某种奇怪的原因,针对我们的对象的 stringify() 只返回第一个关卡数据:

{ "level1": [] }

.

我已经尝试改变我们的对象加载值的方式,但是这一切都回到了 stringify() '删除'在同一级别没有伴随属性/属性值的数组值。

【问题讨论】:

  • 你能把调用stringify的代码包括进来吗?当我使用您提供的数据进行尝试时,我会得到完整的结果
  • @OliverRadini - 是的,示例结构没有复制它(并且应该),但您可以从屏幕截图中看出发生了什么。
  • @T.J.Crowder 啊,有道理 - 我想我已经开发了截图失明!

标签: javascript arrays json object stringify


【解决方案1】:

问题是您的client 是一个数组,但您在其上放置了不是数组条目的属性(您可以这样做,因为数组是对象):

JSON.stringify 只包含数组的数组项,不包含其他属性:

const a = [];
a.nonEntryProperty = "foo";
a[0] = "bar";
console.log(JSON.stringify(a)); // ["bar"]

为确保数据正确序列化为 JSON,请在对象中包含类似对象的属性,并在数组中包含数组条目:

const structure = {
  info: {
    nonEntryProperty: "foo"
  },
  array: ["bar"]
};
console.log(JSON.stringify(structure, null, 4));

【讨论】:

  • 嗨 TJ,有解决办法吗?我是否从内到外“解包”json?
  • 不要向数组对象添加属性,而是创建一个包含数组属性的对象,例如{"bar":"foo","contents":[1,4,6]}
  • @GregRowles - 意思是在答案中说(doh!):将对象用于对象内容,将数组用于数组内容。我已经更新了,很抱歉。
【解决方案2】:

好的,解决了;当它应该是对象时,我们正在创建数组,反之亦然;抱歉这个含糊的问题,但谢谢 TJ 和塞巴斯蒂安。根据“level1.level2”的规范,解决方案是为“level1”创建对象{},为最后一项“level2”创建数组[]...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 2018-03-14
    • 2011-10-10
    • 2022-11-15
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多