使用Java访问JSONArray中项目的成员


122

我刚刚开始在Java中使用json。我不确定如何访问JSONArray中的字符串值。例如,我的json看起来像这样:

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

我现在可以访问“ record” JSONArray,但是不确定如何在for循环中获取“ id”和“ loc”值。抱歉,如果此说明不太清楚,我对编程有点陌生。


2
另一件事(可能是您找到了)-您错过了第三个id值后的逗号。总是使用一些解析器是很好的,例如json.parser.online.fr
Krystian

Answers:


218

您是否尝试过使用JSONArray.getJSONObject(int)JSONArray.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");
    // ...
}

我不明白 如果我们能得到id一个sinple getInt像我们如何通过指定的键获取HashMap的价值,那么为什么我们要与迭代for循环?难道循环不使idget被分配int id多次吗?
2016年

对于更复杂的JSON,请根据examples.javacodegeeks.com/core-java/json/…
vikramvi

我怎样才能做到这一点的PHP?
哈妮·阿塞米

如果我知道ID但需要匹配的位置,这将如何工作?
ToofanHas19年

6

一个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
这对我不起作用,因为a JSONArray不可迭代。
michel404

8
org.json.JSONArray不迭代,但net.sf.json.JSONArray是可迭代
MJ

您的链接已损坏
VdeX

4

经过将近20年的发展,Java 8进入了市场,以下是org.json.JSONArray使用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
}

如果迭代只有一次,(无需.collect

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

1
.mapToObj显示“未处理的异常:JSONException”
Andrejs

1
在语法上.mapToObj(index -> (JSONObject) array.get(index)),存在jsonArray.get(index)可能会抛出的错误JSONExceptionJSONException extends RuntimeException所以它至少应在编译时罚款
祈祷报

2

通过查看您的代码,我感觉您正在使用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 );  

0

万一它对其他人有帮助,我可以通过执行以下操作将其转换为数组,

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

...或者您应该能够获得长度

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

org.json.JSONObject有一个toJSONArray(JSONArray names)方法,org.json.JSONArray有一个toJSONObject(JSONArray names)方法,但没有toArray()方法。
BrionS

-1

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

(String)(((HashMap)regs.get(“ firstlevelkey”))。get(“ secondlevelkey”);


1
进一步说明为什么您的答案比当前接受的答案更好,这将有助于您理解解决方案。
Vadimo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.