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.


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");
    // ...
}

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... :)


10
To nie działa dla mnie, ponieważ JSONArraynie jest iterowalne.
michel404


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);
            });

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

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

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


1
Nieco dokładniejsze wyjaśnienie, dlaczego Twoja odpowiedź jest lepsza niż obecnie zaakceptowana, pomogłoby w zrozumieniu Twojego rozwiązania.
Vadimo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.