嵌套的 JSON 对象——我必须为所有事情使用数组吗?

有没有什么方法可以在 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]

and

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 解析器)接受第二个样式对象。如果有人可以启发我,我将不胜感激!

388826 次浏览

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

{ "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'};

您不需要使用数组。

JSON values can be arrays, objects, or primitives (numbers or strings).

您可以这样编写 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 数据中有太多冗余的嵌套数组,但是可以检索这些信息。不过就像其他人说的,你可能需要清理一下。

在另一个 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);
});
});


});