Objetos JSON aninhados - preciso usar matrizes para tudo?

108

Existe alguma maneira de ter objetos aninhados em JSON para que eu não precise criar matrizes de tudo? Para que meu objeto seja analisado sem erros, parece que preciso de uma estrutura como esta:

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

Se eu buscar este objeto em uma variável chamada "resultado", tenho que acessar os objetos aninhados assim:

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

e

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

Isso me parece desajeitado e redundante, se possível, eu preferiria:

result.stuff.onetype[0]

e

result.otherstuff.thing

Mas como posso usar as chaves de objeto diretamente quando tudo é um array? Para minha mente confusa e sem educação, algo assim pareceria mais apropriado:

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

Provavelmente não entendi algo fundamental aqui, mas não consigo fazer com que o analisador jQuery (nem o analisador FF nativo usado por jQuery 1.4) aceite o segundo objeto de estilo. Se alguém puder me esclarecer, agradeceria muito!

John Schulze
fonte
1
A sintaxe para um objeto com mais de uma propriedade é a seguinte:{"stuff": ..., "otherstuff": ...}
Jason Orendorff
1
@Jason: Ele parece já saber disso; ele mesmo escreveu {"id":2,"name": ""}. No entanto, é mais ou menos isso que ele está perguntando, então não tenho certeza.
SLaks de

Respostas:

201

Você não precisa usar matrizes.

Os valores JSON podem ser arrays, objetos ou primitivos (números ou strings).

Você pode escrever JSON assim:

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

Você pode usá-lo assim:

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
fonte
9

Cada objeto deve ser nomeado dentro do objeto pai:

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

Portanto, você não pode declarar um objeto como este:

var obj = {property1, property2};

Tem que ser

var obj = {property1: 'value', property2: 'value'};
Igor Zevaka
fonte
8

Você tem muitos arrays aninhados redundantes dentro de seus dados jSON, mas é possível recuperar as informações. Embora, como outros disseram, você possa querer limpá-lo.

use each () wrap dentro de outro each () até o último array.

pois result.data[0].stuff[0].onetype[0]em jQuery você poderia fazer o seguinte:

`

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

});

`

Syarul
fonte