2010-10-25 2 views
2

J'ai un webservice (RestEasy) retournant un objet JSON contenant un élément List> < ..>. J'essaye d'analyser les résultats dans un Javascript pour la boucle. Si l'élément List <> a 2 éléments ou plus, tout va bien. Si l'élément List <> n'a qu'un seul élément, la boucle Javascript se rompt. Ceci est dû au fait que la représentation JSON change réellement lorsqu'il n'y a qu'un seul élément. Par exemple:Analyse JSON avec Javascript

{"parent":[{"a":1},{"b":2}]} 

fonctionne très bien ... mais pour une raison quelconque, le JSON ressemble à ceci pour un enfant:

{"parent":{"a":1}} 

Note ... que l'indicateur de tableau [] est manquante.

Est-ce JSON standard? Ce type de notation force des contrôles inutiles et inutiles dans mon javascript pour l'existence ou la taille, etc. d'un tableau attendu ...

Est-ce une pratique standard cohérente? Pourquoi JSON ne renvoie-t-il pas une liste d'un? Est-ce probablement un artefact de mon côté serveur et est-ce que les autres générateurs côté serveur construiraient une représentation JSON différente? J'ai même essayé d'utiliser dojo.forEach et cela fonctionne très bien jusqu'à ce qu'il atteigne le tableau d'éléments uniques qui, malheureusement, n'a aucun type de notation de liste.

+0

Les réponses sont assez cohérentes. Merci pour toutes vos réponses rapides. –

Répondre

0

Ceci est un artefact de votre côté serveur. Il se peut que votre infrastructure fournisse l'infrastructure de données au générateur JSON de cette manière, je suppose que ce n'est pas le problème du générateur lui-même.

7

Cela n'a rien à voir avec le format JSON. Le format JSON fait absolument la distinction entre {"a":1} (un objet) et [{"a":1}] (un tableau contenant un objet comme seul élément).

Voir le comportement différemment est un bug dans le générateur côté serveur. Vous auriez à creuser dans ce code pour découvrir pourquoi il choisirait de représenter de façon erronée les tableaux à un seul élément.

1

Ce n'est pas un problème avec JSON en soi. JSON est simplement un ensemble de règles lexicales. Au contraire, cela ressemble à une mauvaise conception ou mise en œuvre du service Web REST. Si la spécification indique qu'il va changer la structure en fonction de s'il y a un ou plusieurs articles, alors je dirais que c'est une conception surprenante qui viole le "principe de la moindre étonnement". Si la spécification ne le dit pas, ce serait un bug dans le service web.

0

Alors pas un problème JS/JSON, une solution de contournement JS est disponible comme ceci:

if(data["parent"]["child"] instanceof Array) { 
    $.each(data["parent"]["child"], function(i, attr) { 
     var myVal = attr["@name"]; 
     //now do something 
    });  
} 
else { 
    var myVal = data["parent"]["child"]["@name"]; 
    // do something 
}