2009-10-14 20 views
89

我剛剛開始使用json和java。我不知道如何訪問JSONArray中的字符串值。例如,我的JSON是這樣的:使用Java訪問JSONArray中的項目成員

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

我的代碼:

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

我在這一點上獲得了「記錄」 JSONArray,但我不確定,我怎麼會得到for循環中的「id」和「loc」值。對不起,如果這個描述不太清楚,我對編程有點新意。

+1

另一件事(可能你找到了它) - 你在第三個id值後錯過了一個逗號。總是使用一些解析器是很好的,例如http://json.parser.online.fr/ – Krystian 2016-03-15 14:08:41

回答

178

您是否嘗試過使用[JSONArray.getJSONObject(int)http://json.org/javadoc/org/json/JSONArray.html#getJSONObject(int))和[JSONArray.length()http://json.org/javadoc/org/json/JSONArray.html#length())創建您的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

啊,這很有道理。感謝這個例子! 乾杯 – minimalpop 2009-10-14 21:09:23

+0

我不明白這一點。如果我們可以通過一個sinple getInt來獲得id,就像我們通過指定key來獲取hashmap的值一樣,那麼爲什麼我們必須迭代for循環呢?循環迭代不會使'id'多次分配給'int id'嗎? – Nav 2016-06-28 10:04:29

+0

對於更復雜的JSON,根據https://examples.javacodegeeks.com/core-java/json/java-json-parser-example/ – vikramvi 2016-06-29 14:47:53

1

通過看你的代碼,我感覺你正在使用JSONLIB如果是這樣。的情況下,看下面的代碼片段,以JSON數組轉換爲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不迭代。
這裏是我如何處理埃爾對此語句在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"); 
     ... 
    } 

的偉大工程... :)

+10

這對我不起作用,因爲'JSONArray'不可迭代。 – michel404 2012-05-06 13:31:19

+7

[org.json.JSONArray](http://www.json.org/javadoc/org/json/JSONArray.html)不可迭代,但[net.sf.json。JSONArray](http://json-lib.sourceforge.net/apidocs/net/sf/json/JSONArray.html)是可迭代的 – 2013-07-11 17:49:04

+0

你的鏈接被破壞 – VedX 2017-09-29 03:12:05

0

在情況下,它可以幫助別人, 我能夠做這樣的事情來轉換成數組,

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

...或者你應該能夠獲得的長度

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

'org.json.JSONObject'有一個'toJSONArray(JSONArray名字) 'method和'org.json.JSONArray'有一個'toJSONObject(JSONArray names)'方法,但它沒有'toArray()'方法。 – BrionS 2017-03-10 20:14:08

1

的Java 8在近二十年的市場中,以下是使用java8 Stream API迭代org.json.JSONArray的方法。

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 
} 

如果迭代只有一個時間,(無需.collect

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

'.mapToObj'以語法'.mapToObj(index - >(JSONObject)array.get(index))',theres'jsonArray.get(index)''的語法顯示「未處理的異常:JSONException」 – Andrejs 2017-11-09 20:22:44

+0

,它可能會拋出'JSONException'但是'JSONException擴展了RuntimeException',所以它至少在編譯時應該罰款 – prayagupd 2017-11-11 07:05:29

-1

HashMap中的REG =(HashMap中)parser.parse(stringjson); (String)(()HashMap)regs.get(「firstlevelkey」))。get(「secondlevelkey」);

+0

稍微澄清一下爲什麼你的答案更好,那麼當前接受的答案會有助於理解你的解決方案。 – Vadimo 2017-11-02 00:11:03