Verschachtelte JSON-Objekte - muss ich für alles Arrays verwenden?


108

Gibt es eine Möglichkeit, verschachtelte Objekte in JSON zu haben, damit ich nicht aus allem Arrays erstellen muss? Damit mein Objekt fehlerfrei analysiert werden kann, brauche ich eine Struktur wie diese:

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

Wenn ich dieses Objekt in eine Variable namens "result" bringe, muss ich wie folgt auf die verschachtelten Objekte zugreifen:

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

und

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

Dies erscheint mir ungeschickt und überflüssig, wenn möglich würde ich es vorziehen:

result.stuff.onetype[0]

und

result.otherstuff.thing

Aber wie kann ich die Objektschlüssel direkt verwenden, wenn alles ein Array ist? Für meinen verwirrten und ungebildeten Verstand scheint so etwas angemessener zu sein:

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

Ich habe hier wahrscheinlich etwas Grundlegendes falsch verstanden, aber ich kann weder den jQuery-Parser (noch den von jQuery 1.4 verwendeten nativen FF-Parser) dazu bringen, das Objekt im zweiten Stil zu akzeptieren. Wenn mich jemand aufklären kann, wäre ich dankbar!


1
Die Syntax für ein Objekt mit mehr als einer Eigenschaft lautet wie folgt:{"stuff": ..., "otherstuff": ...}
Jason Orendorff

1
@ Jason: Er scheint das schon zu wissen; er selbst schrieb {"id":2,"name": ""}. Das ist jedoch mehr oder weniger das, was er verlangt, also bin ich mir nicht sicher.
SLaks

Antworten:


201

Sie müssen keine Arrays verwenden.

JSON-Werte können Arrays, Objekte oder Grundelemente (Zahlen oder Zeichenfolgen) sein.

Sie können JSON folgendermaßen schreiben:

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

Sie können es so verwenden:

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

Jedes Objekt muss innerhalb des übergeordneten Objekts benannt werden:

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

Sie können ein Objekt wie folgt also nicht deklarieren:

var obj = {property1, property2};

Es muss sein

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

8

Sie haben zu viele redundante verschachtelte Arrays in Ihren jSON-Daten, aber es ist möglich, die Informationen abzurufen. Obwohl, wie andere gesagt haben, möchten Sie es vielleicht aufräumen.

Verwenden Sie jeden () Wrap innerhalb eines anderen () bis zum letzten Array.

für result.data[0].stuff[0].onetype[0]in jQuery können Sie Folgendes tun:

`

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

});

`

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.