İç içe geçmiş JSON nesneleri - her şey için diziler kullanmam gerekir mi?


110

JSON'da iç içe nesneler bulundurmanın bir yolu var mı, böylece her şeyden diziler yapmak zorunda kalmayayım? Nesnemin hatasız çözümlenmesi için şöyle bir yapıya ihtiyacım var gibi görünüyor:

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

Bu nesneyi "sonuç" adlı bir değişkene getirirsem, aşağıdaki gibi iç içe geçmiş nesnelere erişmem gerekir:

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

ve

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

Bu bana beceriksiz ve gereksiz görünüyor, mümkünse tercih ederim:

result.stuff.onetype[0]

ve

result.otherstuff.thing

Ama her şey bir diziyken nesne anahtarlarını doğrudan nasıl kullanabilirim? Kafam karışmış ve eğitimsiz zihnime bunun gibi bir şey daha uygun görünebilir:

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

Muhtemelen burada temel bir şeyi yanlış anladım, ancak jQuery ayrıştırıcısını (ya da jQuery 1.4 tarafından kullanılan yerel FF ayrıştırıcısını) ikinci stil nesnesini kabul etmek için alamıyorum. Beni aydınlatabilecek biri varsa minnettar olur!


1
Birden fazla özelliği olan bir nesnenin sözdizimi şu {"stuff": ..., "otherstuff": ...}
şekildedir

1
@ Jason: Bunu zaten biliyor gibi görünüyor ; kendisi yazdı {"id":2,"name": ""}. Ancak, aşağı yukarı onun istediği şey bu, bu yüzden emin değilim.
SLaks

Yanıtlar:


202

Dizileri kullanmanıza gerek yok.

JSON değerleri diziler, nesneler veya ilkeller (sayılar veya dizeler) olabilir.

JSON'u şu şekilde yazabilirsiniz:

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

Bunu şu şekilde kullanabilirsiniz:

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

Her nesne, üst nesnenin içinde adlandırılmalıdır:

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

Yani bunun gibi bir nesne ilan edemezsiniz:

var obj = {property1, property2};

Olmak zorunda

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

8

JSON verilerinizin içinde çok fazla yedekli iç içe diziniz var, ancak bilgileri almak mümkündür. Yine de diğerleri gibi temizlemek isteyebileceğinizi söylediler.

son diziye kadar each () wrap'i başka each () içinde kullanın.

için result.data[0].stuff[0].onetype[0]de jQuery aşağıdakileri yapabilirsiniz:

'

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

});

'

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.