2009-10-14 20 views
89

Ich fange gerade erst an, json mit java zu verwenden. Ich bin mir nicht sicher, wie ich auf String-Werte innerhalb eines JSONArrays zugreifen kann. So sieht meine Json wie folgt aus:Zugriff auf Elemente von Elementen in einem JSONArray mit Java

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

mein Code:

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

Ich habe Zugriff auf den „record“ JSONArray an dieser Stelle, aber ich bin nicht sicher, wie ich das bekommen würde "id" und "loc" -Werte innerhalb einer for-Schleife. Tut mir leid, wenn diese Beschreibung nicht zu klar ist, bin ich ein bisschen neu in der Programmierung.

+1

Eine andere Sache (wahrscheinlich haben Sie es gefunden) - Sie haben ein Komma nach dem dritten ID-Wert verpasst. Es ist gut, immer einen Parser zu benutzen, zum Beispiel http://json.parser.online.fr/ – Krystian

Antwort

178

Haben Sie versucht mit [JSONArray.getJSONObject(int)] (http://json.org/javadoc/org/json/JSONArray.html#getJSONObject(int)) und [JSONArray.length()] (http://json.org/javadoc/org/json/JSONArray.html#length()) Ihre for-Schleife zu erstellen:

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, das macht Sinn. Danke für das Beispiel! Prost – minimalpop

+0

Ich verstehe das nicht. Wenn wir 'id' mit einem sinple' getInt' erhalten, wie wir den Wert einer hashmap erhalten, indem wir den Schlüssel spezifizieren, warum müssen wir dann mit einer for-Schleife iterieren? Führt die Iteration mit der Schleife nicht dazu, dass die 'id' mehrfach 'id' zugewiesen wird? – Nav

+0

Für komplexere JSON fand diese nette Lösung per https://examples.javacodegeeks.com/core-java/json/java-json-parser-example/ – vikramvi

1

von an Ihrem Code suchen, ich spüre Sie JSONLIB verwenden Wenn das war. Blick der Fall ist, auf der folgenden Schnipsel json Array Java Array ..

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

Ein org.json.JSONArray nicht iterable zu konvertieren ist.
Hier ist, wie ich el verarbeiten ements in einem 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"); 
     ... 
    } 

großen Werken ... :)

+10

Dies funktioniert nicht für mich, da ein 'JSONArray' nicht iterierbar ist. – michel404

+7

[org.json.JSONArray] (http://www.json.org/javadoc/org/json/JSONArray.html) ist nicht iterierbar, aber [net.sf.json.JSONArray] (http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONArray.html) ist Iterable –

+0

Ihr Link ist gebrochen – VedX

0

Im Fall hilft es jemand anderen, ich in der Lage war, auf ein Array zu konvertieren, indem so etwas wie dies zu tun,

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

... oder sollten Sie die Länge

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

'org.json.JSONObject' hat ein' toJSONArray (JSONArray Namen) 'method und' org.json.JSONArray' haben eine 'toJSONObject (JSONArray names)' Methode, aber keine 'toArray()' Methode. – BrionS

1

Java 8 erhalten können, auf dem Markt nach fast 2 Jahrzehnten, ist der Weg, org.json.JSONArray mit Java 8 Stream API zu iterieren.

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 
} 

Wenn die Iteration nur eine Zeit (keine Notwendigkeit zur .collect)

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

'.mapToObj' zeigt" unbehandelte Ausnahme: JSONException " – Andrejs

+0

in der Syntax' .mapToObj (index -> (JSONObject) array.get (index)) ', theres' jsonArray.get (index) 'was potenziell' JSONException' auslösen kann aber 'JSONException verlängert RuntimeException', so sollte es mindestens zur Kompilierungszeit in Ordnung sein. – prayagupd

-1

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

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

+0

Ein bisschen mehr Klarstellung, warum Ihre Antwort besser ist als die aktuell akzeptierte würde Ihnen helfen, Ihre Lösung zu verstehen. – Vadimo

Verwandte Themen