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!

John Schulze
quelle
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.
SLaks
quelle
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'};
Igor Zevaka
quelle
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);
        });
    });

});

`

Syarul
quelle