127 votes

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

Est-il possible d'avoir des objets imbriqués dans JSON donc je n'ai pas à faire des tableaux de tout? Pour mon objet à être analysé sans erreur que j'ai l'impression d'avoir besoin d'une structure comme ceci:

{"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érer cet objet dans une variable appelée "résultat" - je accès à des objets imbriqués comme ceci:

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

et

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

Cela semble maladroit et redondants pour moi, si possible, je préfère:

result.stuff.onetype[0]

et

result.otherstuff.thing

Mais comment puis-je utiliser les clés de l'objet directement, quand tout est un tableau? Pour ma confus et sans éducation, l'esprit quelque chose comme cela semblerait 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 n'arrive pas à jQuery parser (ni le natvie FF analyseur utilisé par jQuery 1.4) pour accepter le deuxième objet de style. Si quelqu'un peut m'éclairer ce serait grandement appréciée!

Merci beaucoup,

JS

239voto

SLaks Points 391154

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.
 

16voto

Igor Zevaka Points 32586

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

Donc, vous ne pouvez pas déclarer un objet comme celui-ci:

 var obj = {property1, property2};
 

Il doit être

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

9voto

syarul Points 70

Vous avez plusieurs tableaux imbriqués redondants dans vos données jSON, mais il est possible de récupérer les informations. Bien que comme les autres disent, vous feriez mieux de le nettoyer.

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

pour result.data[0].stuff[0].onetype[0] vous pourriez faire

`

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

});
 

`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X