Zagnieżdżone obiekty JSON - czy do wszystkiego muszę używać tablic?

110

Czy istnieje sposób na zagnieżdżenie obiektów w JSON, aby nie musieć tworzyć tablic ze wszystkiego? Aby mój obiekt mógł zostać przeanalizowany bez błędów, potrzebuję takiej struktury:

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

Jeśli pobieram ten obiekt do zmiennej o nazwie „result”, muszę uzyskać dostęp do zagnieżdżonych obiektów w następujący sposób:

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

i

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

Wydaje mi się to niezdarne i zbędne, jeśli to możliwe, wolałbym:

result.stuff.onetype[0]

i

result.otherstuff.thing

Ale jak mogę bezpośrednio używać kluczy obiektów, gdy wszystko jest tablicą? Dla mojego zdezorientowanego i niewykształconego umysłu coś takiego wydawałoby się bardziej odpowiednie:

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

Prawdopodobnie źle zrozumiałem tutaj coś fundamentalnego, ale nie mogę uzyskać parsera jQuery (ani natywnego parsera FF używanego przez jQuery 1.4) do zaakceptowania drugiego obiektu stylu. Jeśli ktokolwiek może mnie oświecić, będzie to z wdzięcznością!

John Schulze
źródło
1
Składnia obiektu z więcej niż jedną właściwością jest następująca:{"stuff": ..., "otherstuff": ...}
Jason Orendorff,
1
@Jason: Wydaje się, że już to wie; on sam napisał {"id":2,"name": ""}. Jednak o to mniej więcej pyta, więc nie jestem pewien.
SLaks

Odpowiedzi:

202

Nie musisz używać tablic.

Wartościami JSON mogą być tablice, obiekty lub prymitywy (liczby lub ciągi znaków).

Możesz napisać JSON w ten sposób:

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

Możesz go używać w ten sposób:

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
źródło
9

Każdy obiekt musi mieć nazwę wewnątrz obiektu nadrzędnego:

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

Więc nie możesz zadeklarować obiektu takiego jak ten:

var obj = {property1, property2};

To musi być

var obj = {property1: 'value', property2: 'value'};
Igor Zevaka
źródło
8

Masz zbyt wiele redundantnych zagnieżdżonych tablic w danych jSON, ale możliwe jest pobranie informacji. Chociaż, jak mówili inni, możesz chcieć to posprzątać.

użyj each () zawiń w innym each () aż do ostatniej tablicy.

dla result.data[0].stuff[0].onetype[0]w jQuery można wykonać następujące czynności:

`

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

});

`

syarul
źródło