2009-10-14 16 views
89

Ho appena iniziato a utilizzare json con java. Non sono sicuro di come accedere ai valori stringa all'interno di un JSONArray. Per esempio, il mio JSON è simile al seguente:Accesso ai membri di elementi in un JSONArray con Java

{ 
    "locations": { 
    "record": [ 
     { 
     "id": 8817, 
     "loc": "NEW YORK CITY" 
     }, 
     { 
     "id": 2873, 
     "loc": "UNITED STATES" 
     }, 
     { 
     "id": 1501 
     "loc": "NEW YORK STATE" 
     } 
    ] 
    } 
} 

il mio codice:

JSONObject req = new JSONObject(join(loadStrings(data.json),"")); 
JSONObject locs = req.getJSONObject("locations"); 
JSONArray recs = locs.getJSONArray("record"); 

ho accesso al "record" JSONArray a questo punto, ma sono sicuro di come mi piacerebbe avere la valori "id" e "loc" all'interno di un ciclo for. Scusa se questa descrizione non è chiara, sono un po 'nuovo alla programmazione.

+1

Un'altra cosa (probabilmente lo hai trovato) - hai perso una virgola dopo il terzo valore ID. È bene usare sempre un parser, ad esempio http://json.parser.online.fr/ – Krystian

risposta

178

Hai provato a usare [JSONArray.getJSONObject(int)] (http://json.org/javadoc/org/json/JSONArray.html#getJSONObject(int)), e [JSONArray.length()] (http://json.org/javadoc/org/json/JSONArray.html#length()) per creare il ciclo for:

for (int i = 0; i < recs.length(); ++i) { 
    JSONObject rec = recs.getJSONObject(i); 
    int id = rec.getInt("id"); 
    String loc = rec.getString("loc"); 
    // ... 
} 
+0

ah, questo ha senso. grazie per l'esempio! evviva – minimalpop

+0

Non capisco. Se possiamo ottenere 'id' con un semplice' getInt' come se ottenessimo il valore di una hashmap specificando la chiave, allora perché dovremmo iterare con un ciclo for? Non iterazione con il ciclo, l'ID viene assegnato a "int id" più volte? – Nav

+0

Per JSON più complesso trovato questa bella soluzione per https://examples.javacodegeeks.com/core-java/json/java-json-parser-example/ – vikramvi

1

Guardando il codice, ho la sensazione che si sta utilizzando JSONLIB Se questo era. il caso, guardare il seguente frammento di codice per convertire matrice jSON per serie java ..

JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON(input); 
JsonConfig jsonConfig = new JsonConfig(); 
jsonConfig.setArrayMode(JsonConfig.MODE_OBJECT_ARRAY); 
jsonConfig.setRootClass(Integer.TYPE); 
int[] output = (int[]) JSONSerializer.toJava(jsonArray, jsonConfig); 
4

Un org.json.JSONArray non è iterabile.
Ecco come elaboro el ements in un net.sf.json.JSONArray:

JSONArray lineItems = jsonObject.getJSONArray("lineItems"); 
    for (Object o : lineItems) { 
     JSONObject jsonLineItem = (JSONObject) o; 
     String key = jsonLineItem.getString("key"); 
     String value = jsonLineItem.getString("value"); 
     ... 
    } 

funziona alla grande ... :)

+10

Questo non funziona per me, dal momento che un 'JSONArray' non è iterabile. – michel404

+7

[org.json.JSONArray] (http://www.json.org/javadoc/org/json/JSONArray.html) non è iterable, ma [net.sf.json.JSONArray] (http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONArray.html) è Iterable –

+0

il tuo link è rotto – VedX

0

Nel caso in cui aiuta a qualcun altro, sono stato in grado di convertire in un array facendo qualcosa di simile,

JSONObject jsonObject = (JSONObject)new JSONParser().parse(jsonString); 
((JSONArray) jsonObject).toArray() 

... o si dovrebbe essere in grado di ottenere la lunghezza

((JSONArray) myJsonArray).toArray().length 
+0

'org.json.JSONObject' ha un' toJSONArray (nomi JSONArray) 'metodo e' org.json.JSONArray' ha un metodo 'toJSONObject (nomi JSONArray)' ma non ha un metodo 'toArray()'. – BrionS

1

Java 8 è sul mercato dopo quasi 2 decadi, in seguito è il modo di iterare org.json.JSONArray con java8 Stream API.

import org.json.JSONArray; 
import org.json.JSONObject; 

@Test 
public void access_org_JsonArray() { 
    //Given: array 
    JSONArray jsonArray = new JSONArray(Arrays.asList(new JSONObject(
        new HashMap() {{ 
         put("a", 100); 
         put("b", 200); 
        }} 
      ), 
      new JSONObject(
        new HashMap() {{ 
         put("a", 300); 
         put("b", 400); 
        }} 
      ))); 

    //Then: convert to List<JSONObject> 
    List<JSONObject> jsonItems = IntStream.range(0, jsonArray.length()) 
      .mapToObj(index -> (JSONObject) jsonArray.get(index)) 
      .collect(Collectors.toList()); 

    // you can access the array elements now 
    jsonItems.forEach(arrayElement -> System.out.println(arrayElement.get("a"))); 
    // prints 100, 300 
} 

Se l'iterazione è soltanto una volta, (senza necessità di .collect)

IntStream.range(0, jsonArray.length()) 
      .mapToObj(index -> (JSONObject) jsonArray.get(index)) 
      .forEach(item -> { 
       System.out.println(item); 
      }); 
+0

'.mapToObj' mostra" eccezione non gestita: JSONException " – Andrejs

+0

nella sintassi' .mapToObj (index -> (JSONObject) array.get (index)) ', esiste' jsonArray.get (index) 'che potenzialmente può lanciare' JSONException' ma 'JSONException estende RuntimeException' quindi dovrebbe andare bene almeno al momento della compilazione – prayagupd

-1

REGS HashMap = (HashMap) parser.parse (stringjson);

(Stringa) ((HashMap) regs.get ("firstlevelkey")). Get ("secondlevelkey");

+0

Un po 'più di chiarimento perché la tua risposta è migliore di quella attuale accettata aiuterebbe a capire la tua soluzione. – Vadimo

Problemi correlati