2009-10-14 22 views
89

Po prostu zaczynam od używania json z Javą. Nie jestem pewien, jak uzyskać dostęp do wartości ciągu w JSONArray. Na przykład, mój json wygląda następująco:Uzyskiwanie dostępu do elementów elementów w JSONArray za pomocą Javy

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

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

+1

Inna sprawa (prawdopodobnie znalazłeś) - brakowało przecinka po trzeciej wartości id. Dobrze jest zawsze używać parsera, na przykład http://json.parser.online.fr/ – Krystian

Odpowiedz

178

Czy próbowali za pomocą [JSONArray.getJSONObject(int)] (http://json.org/javadoc/org/json/JSONArray.html#getJSONObject(int)) i [JSONArray.length()] (http://json.org/javadoc/org/json/JSONArray.html#length()) stworzyć swój 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"); 
    // ... 
} 
+0

ah, to ma sens. dzięki za przykład! Pozdrowienia – minimalpop

+0

Nie rozumiem tego. Jeśli możemy uzyskać 'id' z' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' jak możemy uzyskać wartość '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Czy iteracja w pętli nie powoduje, że 'id' jest wielokrotnie przypisywany do' int id'? – Nav

+0

Dla bardziej skomplikowanych JSON znalazł to dobre rozwiązanie na https://examples.javacodegeeks.com/core-java/json/java-json-parser-example/ – vikramvi

1

Patrząc na kod, czuję używasz JSONLIB Jeśli tak było. przypadek, spojrzeć na poniższy urywek przekonwertować json tablicy do tablicy 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); 
4

org.json.JSONArray nie jest iterable.
Oto jak przetwarzać el mentami w sposób 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ż 'JSONArray' nie jest iterable. – michel404

+7

[org.json.JSONArray] (http://www.json.org/javadoc/org/json/JSONArray.html) nie jest iterable, ale [net.sf.json.JSONArray] (http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONArray.html) jest Iterable –

+0

Twój link jest uszkodzony – VedX

0

W przypadku pomaga ktoś inny, byłem w stanie konwertować do tablicy robiąc coś takiego,

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

... lub powinno być w stanie uzyskać długość

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

'org.json.JSONObject' ma' toJSONArray (nazwy JSONArray) 'method i' org.json.JSONArray' ma metodę 'toJSONObject (JSONArray names)', ale nie ma metody 'toArray()'. – BrionS

1

Java 8 jest na rynku po prawie dwóch dekadach, poniżej znajduje się sposób na iterację org.json.JSONArray z API Stream Java.

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 powtórzenie 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); 
      }); 
+0

'.mapToObj' pokazuje" nieobsługiwany wyjątek: JSONException " – Andrejs

+0

w składni' .mapToObj (index -> (JSONObject) array.get (indeks)) ', theres' jsonArray.get (index) 'który potencjalnie może rzucić' JSONException' ale 'JSONException rozszerza RuntimeException', więc powinien dobrze przynajmniej w czasie kompilacji – prayagupd

-1

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

(String) ((HashMap) regs.get ("firstlevelkey")). Get ("drugi poziom");

+0

Trochę więcej wyjaśnień, dlaczego twoja odpowiedź jest lepsza niż ta zaakceptowana, która pomoże zrozumieć twoje rozwiązanie. – Vadimo

Powiązane problemy