Objets JSON imbriqués - dois-je utiliser des tableaux pour tout?

110

Existe-t-il un moyen d'avoir des objets imbriqués dans JSON pour ne pas avoir à créer des tableaux à partir de tout? Pour que mon objet soit analysé sans erreur, il me semble avoir besoin d'une structure comme celle-ci:

{"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 je récupère cet objet dans une variable appelée "résultat", je dois accéder aux objets imbriqués comme ceci:

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

et

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

Cela me semble maladroit et redondant, si possible je préférerais:

result.stuff.onetype[0]

et

result.otherstuff.thing

Mais comment puis-je utiliser les clés d'objet directement lorsque tout est un tableau? À mon esprit confus et inculte, quelque chose comme celui-ci semble plus approprié:

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

J'ai probablement mal compris quelque chose de fondamental ici, mais je ne peux pas faire en sorte que l'analyseur jQuery (ni l'analyseur FF natif utilisé par jQuery 1.4) accepte le deuxième objet de style. Si quelqu'un pouvait m'éclairer, ce serait très apprécié!

John Schulze
la source
1
La syntaxe pour un objet avec plus d'une propriété est la suivante:{"stuff": ..., "otherstuff": ...}
Jason Orendorff
1
@Jason: Il semble déjà le savoir; il a écrit lui-même {"id":2,"name": ""}. Cependant, c'est plus ou moins ce qu'il demande, donc je ne suis pas sûr.
SLaks

Réponses:

202

Vous n'avez pas besoin d'utiliser des tableaux.

Les valeurs JSON peuvent être des tableaux, des objets ou des primitives (nombres ou chaînes).

Vous pouvez écrire JSON comme ceci:

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

Vous pouvez l'utiliser comme ceci:

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
la source
9

Chaque objet doit être nommé à l'intérieur de l'objet parent:

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

Vous ne pouvez donc pas déclarer un objet comme celui-ci:

var obj = {property1, property2};

Ça doit être

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

Vous avez trop de tableaux imbriqués redondants dans vos données jSON, mais il est possible de récupérer les informations. Bien que, comme d'autres l'ont dit, vous voudrez peut-être le nettoyer.

utilisez each () wrap dans un autre each () jusqu'au dernier tableau.

car result.data[0].stuff[0].onetype[0]dans jQuery, vous pouvez faire ce qui suit:

»

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

});

»

Syarul
la source