Zugriff auf Mitglieder von Elementen in einem JSONArray mit Java

122

Ich fange gerade erst an, json mit Java zu verwenden. Ich bin nicht sicher, wie ich auf Zeichenfolgenwerte in einem JSONArray zugreifen soll. Zum Beispiel sieht mein json so aus:

{
  "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 zu diesem Zeitpunkt Zugriff auf das JSONArray "record", bin mir jedoch nicht sicher, wie ich die Werte "id" und "loc" in einer for-Schleife erhalten soll. Entschuldigung, wenn diese Beschreibung nicht zu klar ist, bin ich ein bisschen neu in der Programmierung.

Minimalpop
quelle
2
Eine andere Sache (wahrscheinlich haben Sie sie gefunden) - Sie haben nach dem dritten ID-Wert ein Komma verpasst. Es ist gut, immer einen Parser zu verwenden, zum Beispiel json.parser.online.fr
Krystian

Antworten:

218

Haben Sie versucht, JSONArray.getJSONObject (int) und JSONArray.length () zu verwenden, um 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");
    // ...
}
notnoop
quelle
Ich verstehe das nicht. Wenn wir idmit einem Sinple erhalten können, getIntwie wir den Wert einer Hashmap durch Angabe des Schlüssels erhalten, warum müssen wir dann mit einer for-Schleife iterieren? Wird die idGet- Iteration mit der Schleife nicht int idmehrmals zugewiesen ?
Nav
Für komplexere JSON fand diese nette Lösung per examples.javacodegeeks.com/core-java/json/…
vikramvi
Wie kann ich das für PHP machen?
Hanie Asemi
Wie würde dies funktionieren, wenn ich die ID kenne, aber den passenden Ort benötige?
ToofanHasArrived
6

Ein org.json.JSONArray ist nicht iterierbar.
So verarbeite ich Elemente 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");
        ...
    }

Funktioniert super... :)

Piko
quelle
10
Dies funktioniert bei mir nicht, da a JSONArraynicht iterierbar ist.
michel404
8
org.json.JSONArray ist nicht iterierbar, aber net.sf.json.JSONArray ist iterierbar
MJ
Ihr Link ist defekt
VdeX
4

Java 8 ist nach fast zwei Jahrzehnten auf dem Markt. Im Folgenden wird beschrieben, wie Sie org.json.JSONArraymit der Java8 Stream-API iterieren können.

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 einmal erfolgt (keine Notwendigkeit .collect)

    IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .forEach(item -> {
               System.out.println(item);
            });
betenagupd
quelle
1
.mapToObjzeigt "unbehandelte Ausnahme: JSONException"
Andrejs
1
In der Syntax .mapToObj(index -> (JSONObject) array.get(index))gibt es solche, jsonArray.get(index)die möglicherweise werfen können, JSONExceptionaber JSONException extends RuntimeExceptionso sollte es zumindest zur Kompilierungszeit in
Ordnung sein
2

Wenn Sie sich Ihren Code ansehen, spüren Sie, dass Sie JSONLIB verwenden. Wenn dies der Fall war, sehen Sie sich das folgende Snippet an, um das JSON-Array in ein Java-Array zu konvertieren.

 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 );  
Teja Kantamneni
quelle
0

Falls es jemand anderem hilft, konnte ich auf diese Weise in ein Array konvertieren.

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

... oder Sie sollten in der Lage sein, die Länge zu bekommen

((JSONArray) myJsonArray).toArray().length
wired00
quelle
org.json.JSONObjecthat eine toJSONArray(JSONArray names)Methode und org.json.JSONArrayhat eine toJSONObject(JSONArray names)Methode, aber es hat keine toArray()Methode.
BrionS
-1

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

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

Roger
quelle
1
Ein bisschen mehr Klarheit, warum Ihre Antwort besser ist als die derzeit akzeptierte, würde helfen, Ihre Lösung zu verstehen.
Vadimo