【问题标题】:Nested JSON objects - do I have to use arrays for everything?嵌套的 JSON 对象 - 我必须对所有内容使用数组吗?
【发布时间】: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": ""}。但是,这或多或少是他要问的,所以我不确定。

标签: javascript jquery json syntax parsing


【解决方案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);
        });
    });

});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多