2010-08-16 6 views
9

Sto lavorando a un'app GWT che sta ricevendo una stringa JSON e sto riscontrando un periodo di difficoltà con i valori di ciascun oggetto. Sto provando a trasferire la stringa JSON in arrivo in una serie di oggetti.GWT: gestione della stringa JSON in entrata

Ecco il JSON (dalla scheda di risposta Firebug), la "D" è una cosa NET (Web Service consumata è 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" 
     } 

    ] 
} 

Sto cercando di analizzare il JSON in oggetti, e poi inserirli in un array. sono in grado di utilizzare Window.alert e ottenere l'intero oggetto "d" per eco. Tuttavia, quando si tenta di accedere agli elementi della matrice, GWT debugger appena si blocca.

//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); 

}

Penso di aver ristretto il problema a dove è stata creata l'istanza JSONArray. C'è qualcosa di vistosamente sbagliato nel modo in cui sto provando a farlo, perché non sto ottenendo molto aiuto in termini di messaggi di errore?

+1

Si potrebbe voler dare un'occhiata a questa domanda: http://stackoverflow.com/questions/3449099/parse-json-with-gwt-2-0/ Se ti fidi della tua fonte, dovresti sicuramente usare JavaScript Overlay Types. L'analisi di JSON tramite JSONParser è un PITA (ma necessario, quando la fonte non è attendibile: /). –

risposta

16

In risposta al commento di RMorrisey:
In realtà, è più contorto:/Sarebbe simile a questa (codice non testato, ma si dovrebbe ottenere l'idea generale):

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! 

Come si può vedere, quando usi JSONParser devi/dovresti essere molto cauto - questo è il punto, giusto? Per analizzare un JSON non sicuro (altrimenti, come ho suggerito nei commenti, dovresti andare con JavaScript Overlay Types). Ottieni un JSONValue, controlla se è davvero quello che pensi dovrebbe essere, ad esempio, un JSONObject, ottieni quello JSONObject, controlla se ha la chiave "xyz", ottieni un JSONValue, risciacqua e ripeti. Non il lavoro più interessante, ma almeno il suo più sicuro che solo chiamando eval() su tutto il JSON :)
Attenzione: come Jason ha sottolineato, prima di GWT 2.1, JSONParser utilizzato eval() internamente (aveva solo un metodo parse() - GWT 2.0 javadocs vs GWT 2.1). In GWT 2.1, parse() è diventato obsoleto e sono stati introdotti altri due metodi: parseLenient() (utilizza eval() internamente) e parseStrict() (approccio sicuro). Se davvero devi usare JSONParser, allora suggerirei di passare a GWT 2.1 M2, perché altrimenti potresti usare anche JSO. In alternativa a JSONParser per fonti non attendibili, è possibile provare a integrare json2.js as a JSON parser via JSNI.

PS: cinqoTimo, JSONArray jsonValue = JSONParser.parse(incomingJsonRespone); ovviamente non funziona perché JSONParser.parse ha un tipo di ritorno di JSONValue, non JSONArray - ha non il vostro IDE (Eclipse + Google Plugin?) Avvertirvi? O almeno il compilatore.

+1

Assicurarsi di utilizzare il metodo' parseStrict() 'di' JSONParser' per JSON non attendibile/arbitrario: "ATTENZIONE: per efficienza, questo metodo viene implementato utilizzando la funzione JavaScript' eval() ', che può eseguire script arbitrari NON passare una stringa non affidabile in questo metodo. " (da http://code.google.com/p/google-web-toolkit/source/browse/trunk/user/src/com/google/gwt/json/client/JSONParser.java) –

+0

Hmm, ero sotto l'impressione che 'JSONParser' abbia usato un approccio più sicuro ... stavo per suggerire' parseStrict() ', ma poi ho notato che è stato introdotto in GWT 2.1, quindi OP potrebbe non averlo ancora disponibile. Ma alla luce del commento di Jason, suppongo che sia meglio aggiornare a GWT 2.1 M2 e usare 'parseStrict()' - altrimenti, 'JSONParser' ha ben poco o nessun vantaggio su JSO. –

+0

Il codice non è esattamente corretto, ma l'idea era corretta. Grazie – tpow

2

Sembra che tu non abbia un array, ma un singolo oggetto root, la cui proprietà chiamata 'd' è un array. Non ho familiarità con quell'API specifica, ma forse puoi provare a recuperare un oggetto JSONObject o simile invece di un array?

+0

Grazie, penso di vedere quello che stai dicendo. Vuoi dire analizzarlo in un oggetto JSONObject, quindi in un JSONArray? O semplicemente accedi ai valori stringa direttamente da JSONObject? – tpow

+0

Hai un collegamento a un documento API per la libreria JSONParser che stai utilizzando? – RMorrisey

+1

Non so quali siano le chiamate corrette, ma penso che dovrebbe essere qualcosa del tipo: JSONParser.parse (incomingJsonResponse) .getObject ("d"). GetArray() o JSONParser.parse (incomingJsonResponse) .getArray (" d ") – RMorrisey