Truy cập các thành viên của các mục trong JSONArray với Java


122

Tôi chỉ mới bắt đầu sử dụng json với java. Tôi không chắc về cách truy cập các giá trị chuỗi trong JSONArray. Ví dụ, json của tôi trông như thế này:

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

mã của tôi:

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

Tôi có quyền truy cập vào JSONArray "bản ghi" tại thời điểm này, nhưng không chắc về cách tôi lấy các giá trị "id" và "loc" trong vòng lặp for. Xin lỗi nếu mô tả này không quá rõ ràng, tôi là một người mới lập trình.


2
Một điều khác (có thể bạn đã tìm thấy nó) - bạn đã bỏ lỡ dấu phẩy sau giá trị id thứ ba. Thật tốt khi luôn sử dụng một số trình phân tích cú pháp, ví dụ: json.parser.online.fr
Krystian

Câu trả lời:


218

Bạn đã thử sử dụng JSONArray.getJSONObject (int)JSONArray.length () để tạo vòng lặp của mình chưa:

for (int i = 0; i < recs.length(); ++i) {
    JSONObject rec = recs.getJSONObject(i);
    int id = rec.getInt("id");
    String loc = rec.getString("loc");
    // ...
}

Tôi không hiểu. Nếu chúng ta có thể nhận được idvới sinple getIntnhư cách chúng ta lấy giá trị của một bản đồ băm bằng cách chỉ định khóa, thì tại sao chúng ta phải lặp lại với vòng lặp for? Không lặp lại với vòng lặp làm cho idđược gán cho int idnhiều lần?
Nav

Đối với phức tạp hơn JSON tìm thấy giải pháp này đẹp mỗi examples.javacodegeeks.com/core-java/json/...
vikramvi

làm thế nào tôi có thể làm điều này cho php?
Hanie Asemi

Điều này sẽ hoạt động như thế nào nếu tôi biết ID nhưng cần loc phù hợp?
ToofanHasArrived

6

Một org.json.JSONArray không iterable.
Đây là cách tôi xử lý các phần tử trong 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");
        ...
    }

Hoạt động tuyệt vời ... :)


10
Điều này không hiệu quả với tôi, vì a JSONArraykhông thể lặp lại.
michel404

8
org.json.JSONArray không iterable, nhưng net.sf.json.JSONArray là Iterable
majgis

liên kết của bạn bị hỏng
VdeX 29/09/17

4

Java 8 có mặt trên thị trường sau gần 2 thập kỷ, sau đây là cách lặp lại org.json.JSONArrayvới Java 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
}

Nếu chỉ lặp lại một lần, (không cần .collect)

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

1
.mapToObjhiển thị "ngoại lệ không được giải quyết: JSONException"
Andrejs

1
trong cú pháp .mapToObj(index -> (JSONObject) array.get(index)), theres jsonArray.get(index)mà khả năng có thể ném JSONExceptionnhưng JSONException extends RuntimeExceptionvì thế nên tinh ít nhất là ở thời gian biên dịch
prayagupd

2

Bằng cách nhìn vào mã của bạn, tôi cảm thấy bạn đang sử dụng JSONLIB. Nếu đúng như vậy, hãy xem đoạn mã sau để chuyển đổi mảng json thành mảng 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

Trong trường hợp nó giúp ích cho người khác, tôi có thể chuyển đổi thành một mảng bằng cách làm như thế này,

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

... hoặc bạn sẽ có thể có được độ dài

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

org.json.JSONObjecttoJSONArray(JSONArray names)phương pháp và org.json.JSONArraytoJSONObject(JSONArray names)phương pháp nhưng nó không có toArray()phương pháp.
BrionS

-1

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

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


1
Làm rõ hơn một chút tại sao câu trả lời của bạn tốt hơn thì câu trả lời được chấp nhận hiện tại sẽ giúp hiểu giải pháp của bạn.
Vadimo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.