Objetos JSON anidados: ¿tengo que usar matrices para todo?

109

¿Hay alguna forma de tener objetos anidados en JSON para no tener que hacer arreglos con todo? Para que mi objeto sea analizado sin errores, parece que necesito una estructura 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]]
    }]
}]}

Si busco este objeto en una variable llamada "resultado", tengo que acceder a los objetos anidados como este:

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

y

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

Esto me parece torpe y redundante, si es posible preferiría:

result.stuff.onetype[0]

y

result.otherstuff.thing

Pero, ¿cómo puedo usar las claves de objeto directamente cuando todo es una matriz? Para mi mente confundida y sin educación, algo como esto parecería más apropiado:

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

Probablemente he entendido mal algo fundamental aquí, pero no puedo obtener el analizador jQuery (ni el analizador FF nativo utilizado por jQuery 1.4) para aceptar el segundo objeto de estilo. ¡Si alguien puede iluminarme, se lo agradecería!

John Schulze
fuente
1
La sintaxis de un objeto con más de una propiedad es la siguiente:{"stuff": ..., "otherstuff": ...}
Jason Orendorff
1
@Jason: Parece que ya lo sabe; él mismo escribió {"id":2,"name": ""}. Sin embargo, eso es más o menos lo que pregunta, así que no estoy seguro.
SLaks

Respuestas:

202

No es necesario utilizar matrices.

Los valores JSON pueden ser matrices, objetos o primitivas (números o cadenas).

Puedes escribir JSON así:

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

Puedes usarlo así:

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

Cada objeto tiene que ser nombrado dentro del objeto padre:

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

Entonces no puedes declarar un objeto como este:

var obj = {property1, property2};

Tiene que ser

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

Tiene demasiadas matrices anidadas redundantes dentro de sus datos jSON, pero es posible recuperar la información. Aunque, como otros han dicho, es posible que desee limpiarlo.

use cada ajuste () dentro de otro each () hasta la última matriz.

por result.data[0].stuff[0].onetype[0]en jQuery puedes hacer lo siguiente:

'

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

});

'

Syarul
fuente