2010-01-20 10 views
83

Y a-t-il un moyen d'avoir des objets imbriqués dans JSON pour ne pas avoir à faire des tableaux de tout? Pour mon objet à analyser sans erreur, je semble avoir besoin d'une structure comme celle-ci:Objets JSON imbriqués - dois-je utiliser des tableaux pour tout?

{"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 chercher cet objet dans une variable appelée « résultat » Je dois accéder aux objets imbriqués comme celui-ci:

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 quand tout est un tableau? A mon confus et sans éducation esprit quelque chose comme cela 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 obtenir l'analyseur jQuery (ni l'analyseur FF natif utilisé par jQuery 1.4) pour accepter le deuxième objet de style. Si quelqu'un peut m'éclairer, il serait grandement apprécié!

+1

La syntaxe d'un objet avec plus d'une propriété est comme ceci: '{ "trucs": ..." d'autres choses": ...} ' –

+1

@Jason: Il _appears_ à savoir déjà cela; il a lui-même écrit '{" id ": 2," name ":" "}}. Cependant, c'est plus ou moins ce qu'il demande, donc je ne suis pas sûr. – SLaks

Répondre

151

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. 
+1

Merci SLaks, C'était simple et instructif. – SunnyD

+1

Enfin, un exemple simple de base. Doux. Pourquoi tout le monde doit toujours se montrer? –

7

Chaque objet doit être nommé dans 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'}; 
7

Vous devez beaucoup tableau imbriqué redondants dans vos données JSON, mais il est possible de récupérer l'information. Bien que, comme d'autres disent que vous feriez mieux de le nettoyer.

Utilisez each() dans un autre each() jusqu'à la dernière matrice.

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

`

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

}); 

`

+0

Cela m'a beaucoup aidé !! – Alexxio

+0

syarul, cela m'a beaucoup aidé aussi. Les autres réponses ont peut-être répondu à la question spécifiquement, mais la vôtre m'a aidé à comprendre le concept plus largement. Je vous remercie! – jffgrdnr

Questions connexes