Nested JSON Objects – Moet ik arrays gebruiken voor alles?

Is er een manier om geneste objecten in JSON te hebben, dus ik hoef geen arrays uit alles te maken? Voor mijn object dat wordt geparseerd zonder fout, leek ik een structuur zoals deze nodig:

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

Als ik dit object ophaal in een variabele genaamd “resultaat”, heb ik toegang tot de geneste objecten zoals deze:

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

en

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

Dit lijkt me onhandig en overbodig, indien mogelijk zou ik het liefst hebben:

result.stuff.onetype[0]

en

result.otherstuff.thing

Maar hoe kan ik de objecttoetsen rechtstreeks gebruiken als alles een array is? Naar mijn verwarde en ongeschoolde geest zoiets als dit meer geschikt lijkt:

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

Waarschijnlijk heb ik hier iets fundamenteels verkeerd begrepen, maar ik kan de jQuery-parser (noch de native FF-parser die door jQuery 1.4 wordt gebruikt) niet zover krijgen om het tweede stijlobject te accepteren. Als iemand mij kan informeren, wordt dat zeer op prijs gesteld!


Antwoord 1, autoriteit 100%

U hoeft geen arrays te gebruiken.

JSON-waarden kunnen arrays, objecten of primitieven (getallen of tekenreeksen) zijn.

Je kunt JSON als volgt schrijven:

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

Je kunt het als volgt gebruiken:

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.

Antwoord 2, autoriteit 5%

Elk object moet een naam hebben binnen het bovenliggende object:

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

Je kunt een object dus niet als volgt declareren:

var obj = {property1, property2};

Het moet zijn

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

Antwoord 3, autoriteit 4%

U hebt te veel redundante geneste arrays in uw jSON-gegevens, maar het is mogelijk om de informatie op te halen. Maar zoals anderen al hebben gezegd, wil je het misschien opruimen.

gebruik elke() wrap binnen een andere each() tot de laatste array.

voor result.data[0].stuff[0].onetype[0]in jQuerykunt u het volgende doen:

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

Other episodes