2010-08-16 4 views
9

Je travaille sur une application GWT qui reçoit une chaîne JSON et j'ai du mal à comprendre les valeurs de chaque objet. J'essaie de transférer la chaîne JSON entrante dans un tableau d'objets.GWT: Traitement de la chaîne JSON entrante

Voici le JSON (de l'onglet de réponse Firebug), le "d" est une chose .NET (Web Service consommé est C#.

{ 
    "d": [ 
     { 
      "__type": "Event", 
      "ID": 30, 
      "Bin": 1, 
      "Date": "\/Date(1281544749000)\/", 
      "Desc": "Blue with white stripes.", 
      "Category": "1" 
     }, 
     { 
      "__type": "Event", 
      "ID": 16, 
      "Bin": 3, 
      "Date": "\/Date(1281636239000)\/", 
      "Desc": "Yellow with pink stripes", 
      "Category": "1" 
     } 

    ] 
} 

Je suis en train d'analyser le JSON en objets, puis les insérer dans un tableau. Je suis en mesure d'utiliser Window.alert et obtenir l'ensemble de l'objet « d » faire écho. Cependant, lorsque je tente d'accéder aux éléments du tableau, débogueur GWT se bloque juste.

//My GWT array to receive JSON Array 
ArrayList<Item> itemInfo = new ArrayList<Item>(); 

//Getting response JSON into something I can work with.(THIS FAILS) 
JSONArray jsonValue = JSONParser.parse(incomingJsonRespone); 

//Just trying to verify I'm getting values 
for (int i=0; i<jsonValue.size(); i++) { 
    JSONValue jsonItem = = JsonValue.get(i).getString(); 
    Window.alert(jsonItem); 
    itemInfo.add(jsonItem); 

}

Je pense que j'ai réduit le problème à l'endroit où l'instance JSONArray est en cours de création. Y a-t-il quelque chose qui cloche de façon flagrante dans la façon dont j'essaie de faire cela, parce que je ne reçois pas beaucoup d'aide sous la forme de messages d'erreur?

+1

Vous voudrez peut-être consulter cette question: http://stackoverflow.com/questions/3449099/parse-json-with-gwt-2-0/ Si vous faites confiance à votre source, vous devez absolument utiliser JavaScript Overlay Types. Parser JSON via JSONParser est un PITA (mais nécessaire, quand la source n'est pas fiable: /). –

Répondre

16

En réponse au commentaire de RMorrisey:
En fait, il est plus compliqué:/Il ressemblerait à quelque chose comme ça (code non testé, mais vous devriez avoir l'idée générale):

JSONValue jsonValue; 
JSONArray jsonArray; 
JSONObject jsonObject; 
JSONString jsonString; 
jsonValue = JSONParser.parseStrict(incomingJsonRespone); 
// parseStrict is available in GWT >=2.1 
// But without it, GWT is just internally calling eval() 
// which is strongly discouraged for untrusted sources 

if ((jsonObject = jsonValue.isObject()) == null) { 
    Window.alert("Error parsing the JSON"); 
    // Possibilites: error during download, 
    // someone trying to break the application, etc. 
} 

jsonValue = jsonObject.get("d"); // Actually, this needs 
           // a null check too 
if ((jsonArray = jsonValue.isArray()) == null) { 
    Window.alert("Error parsing the JSON"); 
} 

jsonValue = jsonArray.get(0); 
if ((jsonObject = jsonValue.isObject()) == null) { 
    Window.alert("Error parsing the JSON"); 
} 

jsonValue = jsonObject.get("Desc"); 
if ((jsonString = jsonValue.isString()) == null) { 
    Window.alert("Error parsing the JSON"); 
} 

Window.alert(jsonString.stringValue()); // Finally! 

Comme vous pouvez le voir, lorsque vous utilisez JSONParser vous devez/devez être très prudent - c'est tout le problème, non? Pour analyser un JSON dangereux (sinon, comme je l'ai suggéré dans les commentaires, vous devriez aller avec JavaScript Overlay Types). Vous obtenez un JSONValue, vérifiez si c'est vraiment ce que vous pensez qu'il devrait être, disons, un JSONObject, vous obtenez ce JSONObject, vérifiez s'il a la clé "xyz", vous obtenez un JSONValue, rincez et répétez. Pas le travail le plus intéressant, mais au moins le plus sûr que simplement appeler eval() sur l'ensemble JSON :)
Attention: comme Jason a fait remarquer, avant GWT 2.1, JSONParser utilisé eval() interne (il avait seulement une méthode parse() - GWT 2.0 javadocs vs GWT 2.1). Dans GWT 2.1, parse() est devenu obsolète et deux autres méthodes ont été introduites - parseLenient() (utilise eval() en interne) et parseStrict() (l'approche sécurisée). Si vous devez vraiment utiliser JSONParser, alors je vous suggère de passer à GWT 2.1 M2, car sinon vous pourriez aussi bien utiliser les JSO. Comme une alternative à JSONParser pour les sources non fiables, vous pouvez essayer d'intégrer json2.js as a JSON parser via JSNI.

PS: cinqoTimo, JSONArray jsonValue = JSONParser.parse(incomingJsonRespone); évidemment ne fonctionne pas parce que JSONParser.parse a un type de retour de JSONValue, non JSONArray - ne pas votre IDE (Eclipse + plug-in Google?) Vous avertir? Ou au moins le compilateur.

+1

Assurez-vous d'utiliser la méthode' parseStrict() 'de' JSONParser' pour un JSON non approuvé/arbitraire: "ATTENTION: pour l'efficacité, cette méthode est implémentée avec la fonction JavaScript eval()', qui peut exécuter un script arbitraire NE PAS passer une chaîne non fiable dans cette méthode. " (à l'adresse http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/json/client/JSONParser.java) –

+0

Hmm, j'étais sous l'impression que 'JSONParser' utilisait une approche plus sûre ... J'allais suggérer' parseStrict() ', mais j'ai remarqué qu'il a été introduit dans GWT 2.1, donc OP ne l'a peut-être pas encore disponible. Mais à la lumière du commentaire de Jason, je suppose qu'il est préférable de passer à GWT 2.1 M2 et d'utiliser 'parseStrict()' - sinon, 'JSONParser' a peu ou pas d'avantages par rapport à JSO. –

+0

Le code n'est pas exactement correct, mais l'idée était correcte. Merci – tpow

2

Il semble que vous n'ayez pas de tableau, mais un seul objet racine, dont la propriété appelée «d» est un tableau. Je ne suis pas familier avec cette API spécifique, mais peut-être que vous pouvez essayer de récupérer un JSONObject ou similaire à la place d'un tableau?

+0

Merci, je pense que je vois ce que vous dites. Voulez-vous dire analyser dans un JSONObject, puis dans un JSONArray? Ou simplement accéder aux valeurs de chaîne directement à partir de JSONObject? – tpow

+0

Avez-vous un lien vers un document API pour la bibliothèque JSONParser que vous utilisez? – RMorrisey

+1

Je ne sais pas quels sont les vrais appels, mais je pense que cela devrait être quelque chose comme: JSONParser.parse (incomingJsonResponse) .getObject ("d"). GetArray() ou JSONParser.parse (incomingJsonResponse) .getArray (" d ") – RMorrisey