在json simple中从根遍历JSONObject

32

我正在尝试使用json simple迭代遍历一个json对象。我已经看到了一些答案,可以从中获取getJSONObject("child")

{ "child": { "something": "value", "something2": "value" } }

但是如果我只是有一些东西呢

{
"k1":"v1",
"k2":"v2",
"k3":"v3"
} 

我想要遍历那个json对象。这样做:

And want to iterate over that json object. This:

Iterator iter = jObj.keys();

抛出异常:

cannot find symbol
symbol  : method keys()
location: class org.json.simple.JSONObject
4个回答

66
假设您的JSON对象保存在名为"simple.json"的文件中,您可以按以下方式迭代属性-值对:
JSONParser parser = new JSONParser();

Object obj = parser.parse(new FileReader("simple.json"));

JSONObject jsonObject = (JSONObject) obj;

for(Iterator iterator = jsonObject.keySet().iterator(); iterator.hasNext();) {
    String key = (String) iterator.next();
    System.out.println(jsonObject.get(key));
}

谢谢,问题已解决!不确定为什么我的问题会被踩。 - Z2VvZ3Vp
今天上午大部分时间都在尝试动态访问json对象寻找解决方案。感谢您发布这个帖子! - canadiancreed
@hadi:你使用的JSON-java版本可能太旧了。keySet方法在2012年10月27日之后的任何版本中都可用。 - JonnyJD
重要的是要注意,这是最新的答案。许多其他答案只涉及 jsonObject.keys(),但实际上已经不再使用了。现在必须使用 jsonObject.keySet().iterator() - mewc
1
我写了同样的代码块,但是收到了以下错误信息: Exception in thread "main" java.lang.ClassCastException: org.json.simple.JSONArray cannot be cast to org.json.simple.JSONObject - Haim Sabag
由于keySet返回的顺序不正确,是否有任何选项可以按原样获取键? - neobatman

6
你可以这样做。
String jsonstring = "{ \"child\": { \"something\": \"value\", \"something2\": \"value\" } }";
JSONObject resobj = new JSONObject(jsonstring);
Iterator<?> keys = resobj.keys().iterator();
while(keys.hasNext() ) {
    String key = (String)keys.next();
    if ( resobj.get(key) instanceof JSONObject ) {
        JSONObject xx = new JSONObject(resobj.get(key).toString());
        Log.d("res1",xx.getString("something"));
        Log.d("res2",xx.getString("something2"));
    }
}

0
以下是遍历org.google.jso.JsonElemet集合并通过键过滤特定JsonElement的代码:
Predicate<Map.Entry<String, JsonElement>> keyPredicate = a -> a.getKey().equalsIgnoreCase(jsonAttributeKey);
        Predicate<Map.Entry<String, JsonElement>> valuePredicate = a -> a.getValue()!= null && !a.getValue().isJsonNull();
        return responseJson.getAsJsonObject().entrySet().stream()
                .filter(keyPredicate.and((valuePredicate)))
                .findAny()
                .orElseThrow(() -> {
                    System.out.println(jsonAttributeKey +" tag not exist in the json");
                    return NGPExceptionFactory.getNGPException(errorCode);
                })
                .getValue();

0
在Java 8中,我们可以使用lambda表达式。
void handleJSONObject(JSONObject jsonObject) {
jsonObject.keys().forEachRemaining(key -> {
    Object value = jsonObject.get(key);
    logger.info("Key: {0}\tValue: {1}", key, value);
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接