Accesso ai membri degli elementi in un JSONArray con Java


122

Ho appena iniziato a usare json con java. Non sono sicuro di come accedere ai valori di stringa all'interno di un JSONArray. Ad esempio, il mio json ha questo aspetto:

{
  "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");

A questo punto ho accesso al "record" JSONArray, ma non sono sicuro di come ottenere i valori "id" e "loc" all'interno di un ciclo for. Scusa se questa descrizione non è troppo chiara, sono un po 'nuovo nella programmazione.


2
Un'altra cosa (probabilmente l'hai trovata): ti sei perso una virgola dopo il terzo valore id. È bene utilizzare sempre un parser, ad esempio json.parser.online.fr
Krystian

Risposte:


218

Hai provato a utilizzare JSONArray.getJSONObject (int) e JSONArray.length () per creare il tuo 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");
    // ...
}

Non capisco. Se possiamo ottenere idcon un semplice getIntcome otteniamo il valore di una hashmap specificando la chiave, allora perché dobbiamo iterare con un ciclo for? L'iterazione con il ciclo non fa sì che venga idassegnato int idpiù volte?
Nav

Per più complessa JSON trovato questa bella soluzione per examples.javacodegeeks.com/core-java/json/...
vikramvi

come posso farlo per php?
Hanie Asemi

Come funzionerebbe se conosco l'ID ma ho bisogno del loc corrispondente?
Toofan è arrivato il

6

Un org.json.JSONArray non è iterabile.
Ecco come elaboro gli elementi 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, poiché a JSONArraynon è iterabile.
michel404

8
org.json.JSONArray non è iterabile, ma net.sf.json.JSONArray è iterabile
Majgis

il tuo collegamento è interrotto
VdeX

4

Java 8 è sul mercato dopo quasi 2 decenni, di seguito è riportato il modo per 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 è solo una volta, (non è necessario .collect)

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

1
.mapToObjmostra "eccezione non gestita: JSONException"
Andrejs

1
nella sintassi .mapToObj(index -> (JSONObject) array.get(index)), c'è jsonArray.get(index)che potenzialmente può lanciare JSONExceptionma JSONException extends RuntimeExceptionquindi dovrebbe andare bene almeno in fase di compilazione
prayagupd

2

Osservando il tuo codice, ho la sensazione che tu stia usando JSONLIB. In tal caso, guarda il seguente frammento per convertire un array json in un array 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 );  

0

Nel caso in cui aiuti qualcun altro, sono stato in grado di convertire in un array facendo qualcosa del genere,

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

... o dovresti essere in grado di ottenere la lunghezza

((JSONArray) myJsonArray).toArray().length

org.json.JSONObjectha un toJSONArray(JSONArray names)metodo e org.json.JSONArrayha un toJSONObject(JSONArray names)metodo ma non ha un toArray()metodo.
BrionS

-1

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

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


1
Un po 'più di chiarimento sul motivo per cui la tua risposta è migliore di quella attualmente accettata aiuterebbe a comprendere la tua soluzione.
Vadimo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.