【问题标题】:Foreach with JSONArray and JSONObject使用 JSONArray 和 JSONObject 进行 Foreach
【发布时间】:2015-10-19 13:19:57
【问题描述】:

我正在使用org.json.simple.JSONArrayorg.json.simple.JSONObject。我知道这两个类JSONArrayJSONObject 是不兼容的,但我仍然想做一件很自然的事情 - 我想在每个迭代步骤中解析JSONArray JSONObject (嵌套在里面JSONArray)。我尝试这样做:

JSONArray arr = ...; // <-- got by some procedure
for(JSONObject o: arr){
    parse(o);
}

当我尝试编译这段代码时,我确实得到了“不兼容的类型”错误,尽管它看起来很自然。所以,我的问题是迭代JSONArray 的最佳方式是什么?

【问题讨论】:

    标签: java json


    【解决方案1】:

    似乎您无法使用for each 遍历JSONArray。你可以像这样循环你的JSONArray

    for (int i=0; i < arr.length(); i++) {
        arr.getJSONObject(i);
    }
    

    Source

    【讨论】:

    • 不幸的是,来自org.json.simple.*JSONArray 似乎没有length() 方法和getJSONObject()
    • @Jacobian 你试过使用org.json.JSONArray吗?
    • 现在,我还没有尝试过。它更强大吗?
    • @Jacobian I found this
    • 对于org.json.simple.JSONArray,您需要使用继承自java.util.ArrayList 的size() 方法(而不是length())。
    【解决方案2】:

    显然,org.json.simple.JSONArray 实现了一个 raw 迭代器。这意味着每个元素都被视为Object。您可以尝试投射:

    for(Object o: arr){
        if ( o instanceof JSONObject ) {
            parse((JSONObject)o);
        }
    }
    

    这就是 Java 1.4 及更早版本的工作方式。

    【讨论】:

    • 谢谢!有用。不过,似乎我是使用 java.util.Iterator
    • @Jacobian 是的,它是java.util.Iterator,但它是一个原始(例如List&lt;String&gt; 将返回一个Iterator&lt;String&gt;,然后你可以使用String作为增强的for循环变量的类型。当它是原始的时,基本类型假定为Object
    【解决方案3】:

    确保您使用的是这个 org.json: https://mvnrepository.com/artifact/org.json/json

    如果您使用的是 Java 8,那么您可以使用

    import org.json.JSONArray;
    import org.json.JSONObject;
    
    JSONArray array = ...;
    
    array.forEach(item -> {
        JSONObject obj = (JSONObject) item;
        parse(obj);
    });
    

    刚刚添加了一个简单的测试来证明它有效:

    将以下依赖项添加到您的 pom.xml 文件中(为了证明它有效,我使用了发布此答案时的旧 jar)

    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20160810</version>
    </dependency>
    

    简单的测试代码 sn-p 将是:

    import org.json.JSONArray;
    import org.json.JSONObject;
    
    public class Test {
        public static void main(String args[]) {
            JSONArray array = new JSONArray();
    
            JSONObject object = new JSONObject();
            object.put("key1", "value1");
    
            array.put(object);
    
            array.forEach(item -> {
                System.out.println(item.toString());
            });
        }
    }
    

    输出:

    {"key1":"value1"}
    

    【讨论】:

    • 如果在java 7中使用retrolambda可以达到同样的效果
    • JSONArray 类型的 forEach(( item) -> {}) 方法未定义
    • @Jugi 上面我使用的json库是org.json,你可以在JSONArray上使用forEach,如果你还有疑问可以检查一次
    • 我希望与 Jugi 和 akcasoy 有所不同。这适用于 Java 8 和 org.json.JSONArray。
    • 这适用于此处的 org.json -> mvnrepository.com/artifact/org.json/json 确保您没有使用错误的 org.json
    【解决方案4】:
    • for 循环内,您可以简单地将 Object 类型转换为 JSONObject 并访问这些值。

    例如:

        JSONArray myJSONArray = [...Some JSONObjects Here...];
        JSONObject myJSONObject = new JSONObject();
        for (Object myObject : myJSONArray) {
    
            //If you want to get JSONObject
            myJSONObject = (JSONObject) myObject;
    
            //If you want to access JSONObject's values
            long number     = ((JSONObject) myJSONObject).getLong("myNum");
            String myString = ((JSONObject) myJSONObject).getString("myStr");
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-14
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多