Oggetti JSON nidificati: devo usare gli array per tutto?


109

C'è un modo per avere oggetti annidati in JSON in modo da non dover creare array da tutto? Affinché il mio oggetto possa essere analizzato senza errori, mi sembra di aver bisogno di una struttura come questa:

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

Se prendo questo oggetto in una variabile chiamata "risultato" devo accedere agli oggetti annidati in questo modo:

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

e

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

Questo mi sembra goffo e ridondante, se possibile preferirei:

result.stuff.onetype[0]

e

result.otherstuff.thing

Ma come posso usare direttamente le chiavi dell'oggetto quando tutto è un array? Alla mia mente confusa e non istruita qualcosa del genere sembrerebbe più appropriato:

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

Probabilmente ho frainteso qualcosa di fondamentale qui, ma non riesco a far sì che il parser jQuery (né il parser FF nativo utilizzato da jQuery 1.4) accetti il ​​secondo oggetto di stile. Se qualcuno mi può illuminare, sarebbe apprezzato con gratitudine!


1
La sintassi per un oggetto con più di una proprietà è la seguente:{"stuff": ..., "otherstuff": ...}
Jason Orendorff

1
@ Jason: Sembra che lo sappia già; ha scritto lui stesso {"id":2,"name": ""}. Tuttavia, è più o meno quello che sta chiedendo, quindi non ne sono sicuro.
SLaks

Risposte:


202

Non è necessario utilizzare gli array.

I valori JSON possono essere array, oggetti o primitive (numeri o stringhe).

Puoi scrivere JSON in questo modo:

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

Puoi usarlo in questo modo:

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

Ogni oggetto deve essere nominato all'interno dell'oggetto genitore:

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

Quindi non puoi dichiarare un oggetto come questo:

var obj = {property1, property2};

Deve essere

var obj = {property1: 'value', property2: 'value'};

8

Hai troppi array nidificati ridondanti all'interno dei tuoi dati jSON, ma è possibile recuperare le informazioni. Anche se, come altri hanno detto, potresti voler ripulirlo.

usa each () a capo all'interno di un altro each () fino all'ultimo array.

perché result.data[0].stuff[0].onetype[0]in jQuery potresti fare quanto segue:

`

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

});

`

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.