嵌套的 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 发布上的嵌套对象