ネストされたJSONオブジェクト-すべてに配列を使用する必要がありますか?


108

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パーサー)が2番目のスタイルオブジェクトを受け入れることができません。誰かが私を悟らせることができればそれはありがたいことに感謝します!


1
複数のプロパティを持つオブジェクトのための構文は次のようである:{"stuff": ..., "otherstuff": ...}
ジェイソンOrendorff

1
@ジェイソン:彼すでにそれを知っているようです。彼自身が書いた{"id":2,"name": ""}。しかし、それは多かれ少なかれ彼が求めていることなので、私にはわかりません。
SLaks

回答:


201

配列を使用する必要はありません。

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.

9

すべてのオブジェクトは、親オブジェクト内で名前を付ける必要があります。

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

8

jSONデータ内に冗長なネストされた配列が多すぎますが、情報を取得することは可能です。他の人が言ったように、あなたはそれをきれいにしたいと思うかもしれませんが。

each()を使用して、最後の配列まで別のeach()内でラップします。

以下のためresult.data[0].stuff[0].onetype[0]jQueryの次の操作を行うことができます:

`

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

});

`

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.