2009-10-14 25 views
89

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

{ 
    "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 tiếp cận với những "kỷ lục" JSONArray vào thời điểm này, nhưng không chắc chắn như thế nào tôi sẽ nhận được 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 chút mới để lập trình.

+1

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. Tốt nhất là luôn sử dụng một số trình phân tích cú pháp, ví dụ: http://json.parser.online.fr/ – Krystian

Trả lời

178

Bạn đã cố gắng sử dụng [JSONArray.getJSONObject(int)] (http://json.org/javadoc/org/json/JSONArray.html#getJSONObject(int)) và [JSONArray.length()] (http://json.org/javadoc/org/json/JSONArray.html#length()) để tạo cho vòng lặp:

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, điều đó có ý nghĩa. cảm ơn ví dụ! cổ vũ – minimalpop

+0

Tôi không hiểu. Nếu chúng ta có thể nhận được 'id' với một' getInt' sinple như cách chúng ta nhận giá trị của một hashmap bằng cách chỉ định khóa, thì tại sao chúng ta phải lặp lại với một 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 id' nhiều lần? – Nav

+0

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

1

Bằng cách nhìn vào mã của bạn, tôi cảm nhận được bạn đang sử dụng JSONLIB Nếu đó là. trường hợp, nhìn vào đoạn mã sau đây để chuyển đổi mảng json để 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); 
4

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

Các công việc tuyệt vời ... :)

+10

Điều này không hiệu quả đối với tôi, vì 'JSONArray' không thể lặp lại được. – michel404

+7

[org.json.JSONArray] (http://www.json.org/javadoc/org/json/JSONArray.html) không thể lặp lại được, nhưng [net.sf.json.JSONArray] (http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONArray.html) là Iterable –

+0

liên kết của bạn bị hỏng – VedX

0

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

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

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

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

'org.json.JSONObject' có một tên' toJSONArray (JSONArray) 'method và' org.json.JSONArray' có phương thức 'toJSONObject (JSONArray names)' nhưng nó không có phương thức 'toArray()'. – BrionS

1

Java 8 là trên thị trường sau gần 2 thập kỷ, sau đây là cách để lặp lại org.json.JSONArray với API luồng java8.

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 lặp là một lần duy nhất, (không cần phải .collect)

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

'.mapToObj' hiển thị" ngoại lệ unhandled: JSONException " – Andrejs

+0

trong cú pháp' .mapToObj (index -> (JSONObject) array.get (index)) ', có' jsonArray.get (index) 'có khả năng có thể ném' JSONException' nhưng 'JSONException mở rộng RuntimeException', vì vậy nó sẽ tốt ít nhất tại thời gian biên dịch – prayagupd

-1

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

(Chuỗi) ((HashMap) regs.get ("firstlevelkey")). Get ("secondlevelkey");

+0

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 hiện tại sẽ giúp hiểu rõ giải pháp của bạn. – Vadimo

Các vấn đề liên quan