Dostęp do członków elementów w JSONArray z Javą

122

Dopiero zaczynam używać json z java. Nie jestem pewien, jak uzyskać dostęp do wartości ciągu w JSONArray. Na przykład mój json wygląda tak:

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

mój kod:

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

W tym momencie mam dostęp do „rekordu” JSONArray, ale nie jestem pewien, jak uzyskać wartości „id” i „loc” w pętli for. Przepraszam, jeśli ten opis nie jest zbyt jasny, jestem trochę nowy w programowaniu.

minimalpop
źródło
2
Inna sprawa (prawdopodobnie ją znalazłeś) - przegapiłeś przecinek po trzeciej wartości id. Dobrze jest zawsze używać parsera, na przykład json.parser.online.fr
Krystian

Odpowiedzi:

218

Czy próbowałeś użyć JSONArray.getJSONObject (int) i JSONArray.length () do utworzenia pętli for:

for (int i = 0; i < recs.length(); ++i) {
    JSONObject rec = recs.getJSONObject(i);
    int id = rec.getInt("id");
    String loc = rec.getString("loc");
    // ...
}
notnoop
źródło
Nie rozumiem tego. Jeśli możemy uzyskać idza pomocą sinple, getIntjak otrzymujemy wartość hashmap przez określenie klucza, to dlaczego musimy wykonywać iterację za pomocą pętli for? Czy iteracja z pętlą nie powoduje wielokrotnego idprzypisania get int id?
Nav
Dla bardziej złożonego JSON znalazło to fajne rozwiązanie na przykłady.javacodegeeks.com
core
jak mogę to zrobić dla php?
Hanie Asemi
Jak by to działało, jeśli znam identyfikator, ale potrzebuję pasującego adresu?
Toofan przyjechał w marcu
6

Plik org.json.JSONArray nie jest iterowalny .
Oto jak przetwarzam elementy w pliku 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");
        ...
    }

Działa świetnie... :)

Piko
źródło
10
To nie działa dla mnie, ponieważ JSONArraynie jest iterowalne.
michel404
8
org.json.JSONArray nie jest iterowalny , ale net.sf.json.JSONArray jest
iterowalny
twój link jest uszkodzony
VdeX,
4

Java 8 jest na rynku od prawie dwóch dekad, org.json.JSONArrayoto sposób na iterację z 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
}

Jeśli iteracja jest tylko jeden raz (nie ma potrzeby .collect)

    IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .forEach(item -> {
               System.out.println(item);
            });
prayagupd
źródło
1
.mapToObjpokazuje „nieobsługiwany wyjątek: JSONException”
Andrejs
1
w składni .mapToObj(index -> (JSONObject) array.get(index)), jsonArray.get(index)które potencjalnie mogą się rzucać, JSONExceptionale JSONException extends RuntimeExceptionpowinno
działać
2

Patrząc na Twój kod, wyczuwam, że używasz JSONLIB. W takim przypadku spójrz na poniższy fragment kodu, aby przekonwertować tablicę json na tablicę 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 );  
Teja Kantamneni
źródło
0

Na wypadek, gdyby pomogło to komuś innemu, udało mi się przekonwertować na tablicę, robiąc coś takiego,

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

... albo powinieneś być w stanie uzyskać długość

((JSONArray) myJsonArray).toArray().length
przewodowy00
źródło
org.json.JSONObjectma toJSONArray(JSONArray names)metodę i org.json.JSONArrayma toJSONObject(JSONArray names)metodę, ale nie ma toArray()metody.
BrionS
-1

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

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

zrozumiałem
źródło
1
Nieco dokładniejsze wyjaśnienie, dlaczego Twoja odpowiedź jest lepsza niż obecnie zaakceptowana, pomogłoby w zrozumieniu Twojego rozwiązania.
Vadimo