嵌套的 JSON 对象 - 我必须对所有内容使用数组吗?

Posted

技术标签:

【中文标题】嵌套的 JSON 对象 - 我必须对所有内容使用数组吗?【英文标题】:Nested JSON objects - do I have to use arrays for everything? 【发布时间】:2011-01-07 02:00:15 【问题描述】:

有没有办法在 JSON 中嵌套对象,这样我就不必从所有内容中创建数组?为了让我的对象被正确解析,我似乎需要这样的结构:

"data":["stuff":[
    "onetype":[
        "id":1,"name":"John Doe",
        "id":2,"name":"Don Joeh"
    ],
    "othertype":[
        "id":2,"company":"ACME"
    ]]
,"otherstuff":[
    "thing":
        [[1,42],[2,2]]
    ]
]

如果我将此对象提取到名为“result”的变量中,我必须像这样访问嵌套对象:

result.data[0].stuff[0].onetype[0]

result.data[1].otherstuff[0].thing[0]

这对我来说似乎很笨拙和多余,如果可能的话,我更喜欢:

result.stuff.onetype[0]

result.otherstuff.thing

但是当一切都是数组时,我怎样才能直接使用对象键呢?对于我困惑和未受过教育的头脑来说,这样的事情似乎更合适:

"data":
    "stuff":
        "onetype":[
            "id":1,"name": "",
            "id":2,"name": ""
        ]
        "othertype":[
            "id":2,"xyz": [-2,0,2],"n":"Crab Nebula","t":0,"c":0,"d":5
        ]
    
    "otherstuff":
        "thing":
            [[1,42],[2,2]]
        
    

我可能在这里误解了一些基本的东西,但我无法让 jQuery 解析器(也不是 jQuery 1.4 使用的本机 FF 解析器)接受第二个样式对象。如果有人能启发我,将不胜感激!

【问题讨论】:

具有多个属性的对象的语法如下:"stuff": ..., "otherstuff": ... @Jason:他似乎已经知道了;他自己写了"id":2,"name": ""。但是,这或多或少是他要问的,所以我不确定。 【参考方案1】:

你不需要使用数组。

JSON 值可以是数组、对象或基元(数字或字符串)。

你可以这样写 JSON:

 
    "stuff": 
        "onetype": [
            "id":1,"name":"John Doe",
            "id":2,"name":"Don Joeh"
        ],
        "othertype": "id":2,"company":"ACME"
    , 
    "otherstuff": 
        "thing": [[1,42],[2,2]]
     

你可以这样使用它:

obj.stuff.onetype[0].id
obj.stuff.othertype.id
obj.otherstuff.thing[0][1]  //thing is a nested array or a 2-by-2 matrix.
                            //I'm not sure whether you intended to do that.

【讨论】:

这是正确的解决方案,但它顶部的注释“您不需要使用数组”不是问题。并不是他在使用数组(请注意,此解决方案使用相同的数组)。问题是他将他的数组嵌套在他并排放置的对象中,JSON 需要一个名称:值对。您只能将对象放置在名称:值对的值部分中。解决方案是不要将这些数组嵌套在对象中,这就是该解决方案所做的。虽然这个解决方案更优雅,但下一个解决方案至少了解 OP 做错了什么。【参考方案2】:

每个对象都必须在父对象内命名:

 "data": 
    "stuff": 
        "onetype": [
             "id": 1, "name": "" ,
             "id": 2, "name": "" 
        ],
        "othertype": [
             "id": 2, "xyz": [-2, 0, 2], "n": "Crab Nebula", "t": 0, "c": 0, "d": 5 
        ]
    ,
    "otherstuff": 
        "thing":
            [[1, 42], [2, 2]]
    
  

所以你不能像这样声明一个对象:

var obj = property1, property2;

应该是的

var obj = property1: 'value', property2: 'value';

【讨论】:

这个解决方案正确理解了 OP 做错了什么。最佳解决方案是解决问题的更优雅的方法(摆脱不必要的对象),即使他们误解了 OP 做错了什么。【参考方案3】:

您的 JSON 数据中有太多冗余嵌套数组,但可以检索信息。尽管就像其他人所说的那样,您可能想要清理它。

使用 each() 包裹在另一个 each() 中直到最后一个数组。

对于 jQuery 中的result.data[0].stuff[0].onetype[0],您可以执行以下操作:

$.each(data.result.data, function(index0, v) 
    $.each(v, function (index1, w) 
        $.each(w, function (index2, x) 
            alert(x.id);
        );
    );

);

【讨论】:

以上是关于嵌套的 JSON 对象 - 我必须对所有内容使用数组吗?的主要内容,如果未能解决你的问题,请参考以下文章

JSON Stringify 忽略 Redis 发布上的嵌套对象

jq json将对象移动到嵌套对象并迭代未知名称/对象数

使用改造获取带有 GSON 的嵌套 JSON 对象

Angular 5中json对象的动态嵌套材质菜单

如何在 Node.js 中使用流对大型嵌套对象进行 JSON 字符串化?

使用 Spark 访问嵌套在结构中的 json 数组