Mengakses anggota item dalam JSONArray dengan Java

122

Saya baru saja mulai menggunakan json dengan java. Saya tidak yakin bagaimana mengakses nilai string dalam JSONArray. Misalnya, json saya terlihat seperti ini:

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

kode saya:

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

Saya memiliki akses ke "record" JSONArray pada saat ini, tetapi tidak yakin bagaimana saya akan mendapatkan nilai "id" dan "loc" dalam for loop. Maaf jika uraian ini tidak terlalu jelas, saya agak baru dalam pemrograman.

minimalpop
sumber
2
Hal lain (mungkin Anda menemukannya) - Anda melewatkan tanda koma setelah nilai id ketiga. Ada baiknya untuk selalu menggunakan beberapa parser, misalnya json.parser.online.fr
Krystian

Jawaban:

218

Sudahkah Anda mencoba menggunakan JSONArray.getJSONObject (int) , dan JSONArray.length () untuk membuat for-loop Anda:

for (int i = 0; i < recs.length(); ++i) {
    JSONObject rec = recs.getJSONObject(i);
    int id = rec.getInt("id");
    String loc = rec.getString("loc");
    // ...
}
notnoop
sumber
Saya tidak mengerti. Jika kita bisa mendapatkan iddengan sinple getIntseperti bagaimana kita mendapatkan nilai hashmap dengan menentukan kuncinya, lalu mengapa kita harus mengulang dengan for loop? Bukankah iterasi dengan loop membuat idget ditugaskan ke int idbeberapa kali?
Nav
Untuk JSON yang lebih kompleks, temukan solusi bagus ini per contoh.
Javacodegeeks.com/core-java/json/…
bagaimana saya bisa melakukan ini untuk php?
Hanie Asemi
Bagaimana ini akan bekerja jika saya tahu ID tetapi membutuhkan loc yang cocok?
ToofanHas tiba pada
6

Sebuah org.json.JSONArray tidak dapat diulang .
Inilah cara saya memproses elemen di 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");
        ...
    }

Bekerja dengan baik ... :)

Piko
sumber
10
Ini tidak berhasil untuk saya, karena a JSONArraytidak dapat diulang.
michel404
8
org.json.JSONArray tidak dapat diulang , tetapi net.sf.json.JSONArray adalah Iterable
majgis
link Anda rusak
VdeX
4

Java 8 ada di pasaran setelah hampir 2 dekade, berikut adalah cara untuk melakukan iterasi org.json.JSONArraydengan 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
}

Jika iterasi hanya satu kali, (tidak perlu .collect)

    IntStream.range(0, jsonArray.length())
            .mapToObj(index -> (JSONObject) jsonArray.get(index))
            .forEach(item -> {
               System.out.println(item);
            });
prayagupd.dll
sumber
1
.mapToObjmenunjukkan "pengecualian yang tidak tertangani: JSONException"
Andrejs
1
dalam sintaks .mapToObj(index -> (JSONObject) array.get(index)), ada jsonArray.get(index)yang berpotensi dapat dibuang JSONExceptiontetapi JSONException extends RuntimeExceptionseharusnya baik-baik saja setidaknya pada waktu kompilasi
prayagupd
2

Dengan melihat kode Anda, saya rasa Anda menggunakan JSONLIB. Jika itu masalahnya, lihat cuplikan berikut untuk mengubah array json menjadi 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 );  
Teja Kantamneni
sumber
0

Jika itu membantu orang lain, saya dapat mengonversi ke array dengan melakukan sesuatu seperti ini,

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

... atau Anda harus bisa mendapatkan panjangnya

((JSONArray) myJsonArray).toArray().length
kabel00
sumber
org.json.JSONObjectmemiliki toJSONArray(JSONArray names)metode dan org.json.JSONArraymemiliki toJSONObject(JSONArray names)metode tetapi tidak memiliki toArray()metode.
BrionS
-1

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

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

baiklah
sumber
1
Sedikit lebih banyak klarifikasi mengapa jawaban Anda lebih baik daripada jawaban yang diterima saat ini akan membantu memahami solusi Anda.
Vadimo