【问题标题】:Iterate through JSONObject from root in json simple在 json simple 中从 root 遍历 JSONObject
【发布时间】:2014-08-13 20:23:09
【问题描述】:

我正在尝试使用简单的 json 迭代一个 json 对象。我已经看到答案,您可以从

执行 getJSONObject("child")
{ "child": { "something": "value", "something2": "value" } }

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

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

并且想要遍历 json 对象。这个:

Iterator iter = jObj.keys();

投掷:

cannot find symbol
symbol  : method keys()
location: class org.json.simple.JSONObject

【问题讨论】:

    标签: java json json-simple


    【解决方案1】:

    假设您的 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));
    }
    

    【讨论】:

    • 谢谢解决问题!不知道为什么我对这个问题投了反对票。
    • 我早上的大部分时间都在寻找动态访问 json 对象的解决方案。感谢您提出这个!
    • @hadi:您的JSON-java 版本可能太旧了。 keySet 在 2012 年 10 月 27 日之后的任何版本中都可用。
    • 重要的是要注意这是最新的答案。许多其他答案仅涉及jsonObject.keys(),实际上这不是最新的。您现在必须使用jsonObject.keySet().iterator()
    • 我执行了相同的代码块,但收到此错误:线程“main”中的异常 java.lang.ClassCastException: org.json.simple.JSONArray 无法转换为 org.json.simple.JSONObject
    【解决方案2】:

    你可以这样做

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

    【讨论】:

      【解决方案3】:

      在 Java 8 中我们可以使用 lambdas

      void handleJSONObject(JSONObject jsonObject) {
      jsonObject.keys().forEachRemaining(key -> {
          Object value = jsonObject.get(key);
          logger.info("Key: {0}\tValue: {1}", key, value);
        }
      }
      

      【讨论】:

        【解决方案4】:

        下面是遍历org.google.jso.JsonElemetset并按键过滤掉特定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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-27
          • 1970-01-01
          • 2011-05-27
          • 2021-05-28
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多