Objek JSON bersarang - apakah saya harus menggunakan array untuk semuanya?

109

Apakah ada cara untuk memiliki objek bersarang di JSON sehingga saya tidak perlu membuat array dari semuanya? Agar objek saya dapat diurai tanpa kesalahan, saya sepertinya membutuhkan struktur seperti ini:

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

Jika saya mengambil objek ini menjadi variabel yang disebut "hasil", saya harus mengakses objek bersarang seperti ini:

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

dan

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

Ini tampak kikuk dan berlebihan bagi saya, jika mungkin saya lebih suka:

result.stuff.onetype[0]

dan

result.otherstuff.thing

Tetapi bagaimana saya bisa menggunakan kunci objek secara langsung ketika semuanya adalah array? Bagi pikiran saya yang bingung dan tidak berpendidikan, hal seperti ini tampaknya lebih tepat:

{"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]]
        }
    }
}

Saya mungkin salah memahami sesuatu yang mendasar di sini, tetapi saya tidak bisa mendapatkan parser jQuery (atau parser FF asli yang digunakan oleh jQuery 1.4) untuk menerima objek gaya kedua. Jika ada yang bisa mencerahkan saya, itu akan sangat dihargai!

John Schulze
sumber
1
Sintaks untuk objek dengan lebih dari satu properti adalah seperti ini:{"stuff": ..., "otherstuff": ...}
Jason Orendorff
1
@Jason: Dia tampaknya sudah tahu itu; dia sendiri menulis {"id":2,"name": ""}. Namun, kurang lebih itu yang dia tanyakan, jadi saya tidak yakin.
SLaks

Jawaban:

202

Anda tidak perlu menggunakan array.

Nilai JSON dapat berupa array, objek, atau primitif (angka atau string).

Anda dapat menulis JSON seperti ini:

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

Anda bisa menggunakannya seperti ini:

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.
SLaks
sumber
9

Setiap objek harus diberi nama di dalam objek induk:

{ "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]]
    }
}
}

Jadi Anda tidak dapat mendeklarasikan objek seperti ini:

var obj = {property1, property2};

Itu harus

var obj = {property1: 'value', property2: 'value'};
Igor Zevaka
sumber
8

Anda memiliki terlalu banyak larik bersarang yang redundan di dalam data jSON Anda, tetapi informasi tersebut dapat diambil kembali. Meskipun seperti orang lain katakan Anda mungkin ingin membersihkannya.

gunakan each () wrap dalam each () hingga array terakhir.

karena result.data[0].stuff[0].onetype[0]di jQuery Anda bisa melakukan hal berikut:

`

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

});

`

syarul
sumber