使用net.sf.json的工具包来查询json其实已经很方便了,但在使用中遇到复杂多层的json,查找value时就感觉很麻烦,
所以,动手写了个递归查询的方法,二次封装net.sf.json的工具包,个人感觉挺好用,分享给大家,方法现在只支持简单的key和value的查询
project中要导入支持的jar
代码
方法主要是传了一个要jsonobject或jsonarray进去(用JSONObject.fromObject(....)或JSONArray.fromObject(...)得到的一个总的json对象),然后再传一个空的Map对象,Map的key放要查询的字段名称(在json里的key的名称),然后Map的所有value都放null,
程序自调用跑的时候会帮忙把查到的value放进去。然后就可以把value从Map里拿出来。简单吧,不需要管json是多少层的,是object还是array。
/**
parameters:
* "Object o" is JSONObject or JSONArray that you converted
* from some javabean or string.....by net.sf.json
*
* "Map<String,Object> m" is a empty object, key is the column's
* name that you want to find it out from json object,
* value just set to null first, program will help to set
* the value in.
**/
public void test2(Object o,Map<String,Object> m)
{
if(o.getClass().equals(JSONObject.class))
{
JSONObject temp= (JSONObject)o;
for(String keyMap:m.keySet())
{
if(m.get(keyMap)==null)
{
if(temp.containsKey(keyMap))
{
System.out.println("find out.....................");
// System.out.println(temp.get(keyCondition));
result=temp.get(keyMap);
m.put(keyMap, temp.get(keyMap));
//System.out.println(result);
}
else
{
Iterator it=temp.keySet().iterator();
while(it.hasNext()){
String key;
key=it.next().toString();
Object v=temp.get(key);
if(v.getClass().equals(JSONObject.class)||v.getClass().equals(JSONArray.class))
{
test2(v,m);
}
}
}
}
}
}
else if(o.getClass().equals(JSONArray.class))
{
JSONArray tempArray=(JSONArray) o;
for(Object ob:tempArray)
{
if(ob.getClass().equals(JSONObject.class))
{
JSONObject tempJb=(JSONObject) ob;
for(String keyMap:m.keySet())
{
if(m.get(keyMap)==null)
{
if(tempJb.containsKey(keyMap))
{
System.out.println("find out....2222.................");
// System.out.println(tempJb.get(keyCondition));
result=tempJb.get(keyMap);
m.put(keyMap, tempJb.get(keyMap));
}
else
{
test2(tempJb,m);
}
}
}
}
else if(ob.getClass().equals(JSONArray.class))
{
test2(ob,m);
}
}
}
}
测试代码
用arcgis map server给我们的json来测试吧,那个json复杂啊,它的特点就是够长够复杂。。。。干它!!