迭代org.json.JSONObject的值以对JSONObjects或JSONArrays应用不同的操作

时间:2017-06-12 10:48:45

标签: java java-8 org.json

我必须做这样的事情:

JSONObject obj;
Iterator keys = obj.keys();

while(keys.hasNext()){
    String key = keys.next();
    if(obj.get(key) instanceof JSONOBject){
        //do something
    }
    else if(obj.get(key) instanceof JSONArray){
       //do something else
    } else {
      //do something even different
    }

}

我想用更好的东西来重构这个,如果没有instanceof,那么就如此。也许使用流和选项,但我还没有找到一个很好的方法来使用它们与JSONObjects。任何提示?

1 个答案:

答案 0 :(得分:2)

您可以创建一个Select A.ID ,B.* From YourTable A Cross Apply ( values ('Home' ,HOME_APPDTE1 ,HOMENUMBER1 ,1) ,('Home' ,HOME_APPDTE2 ,HOMENUMBER2 ,2) ,('Home' ,HOME_APPDTE3 ,HOMENUMBER3 ,3) ,('Work' ,WORK_APPDTE1 ,WORKNUMBER1 ,1) ,('Work' ,WORK_APPDTE2 ,WORKNUMBER2 ,2) ,('Work' ,WORK_APPDTE3 ,WORKNUMBER2 ,3) ,('Mobile',MOBILE_APPDTE1,MOBILENUMBER1,1) ,('Mobile',MOBILE_APPDTE2,MOBILENUMBER2,2) ,('Mobile',MOBILE_APPDTE3,MOBILENUMBER3,3) ) B ([Type],[DateChanged],[Tel_Number],[Rank]) 类,将类映射到您要应用的操作(示例代码位于底部以供参考)。然后您可以简单地填充操作:

ActionMap

并在循环中使用地图:

ActionMap m = new ActionMap();
m.put(JSONOBject.class, o -> System.out.println("JSONObject: " + o));
m.put(JSONArray.class, o -> System.out.println("JSONArray: " + o));
//etc.

while(keys.hasNext()){ String key = keys.next(); Object o = obj.get(key); if (m.containsMapping(o)) m.apply(o); else //deal with missing class mapping } 类的简化实现:

ActionMap