递归查询复杂json (java)

本文介绍了如何使用net.sf.json库处理复杂的JSON数据,通过一个递归查询方法,可以方便地获取多层JSON中的值。该方法只需要输入总JSON对象和一个空Map,Map的key为查询字段,value为null,程序将自动填充找到的值。
摘要由CSDN通过智能技术生成

使用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复杂啊,它的特点就是够长够复杂。。。。干它!!



                
### 回答1: 可以使用递归来解析 JSON 数据。以下是一个简单的 Java 代码示例,演示如何使用递归遍历 JSON 对象并提取需要的数据: ```java import org.json.*; public class JsonParser { public static void main(String[] args) { String jsonString = "{\"name\":\"John\", \"age\":30, \"cars\":[\"Ford\", \"BMW\", \"Fiat\"]}"; JSONObject json = new JSONObject(jsonString); parseJson(json); } public static void parseJson(JSONObject json) { for (String key : json.keySet()) { Object value = json.get(key); if (value instanceof JSONObject) { // 如果是一个 JSON 对象,则递归解析它 parseJson((JSONObject) value); } else if (value instanceof JSONArray) { // 如果是一个 JSON 数组,则遍历它并递归解析其的每个元素 JSONArray jsonArray = (JSONArray) value; for (int i = 0; i < jsonArray.length(); i++) { Object element = jsonArray.get(i); if (element instanceof JSONObject) { parseJson((JSONObject) element); } } } else { // 如果是一个基本类型,则输出它 System.out.println(key + ": " + value); } } } } ``` 在上面的代码,我们首先创建了一个包含 JSON 数据的字符串,并将其转换为一个 JSONObject 对象。然后,我们调用 parseJson 方法,并将 JSONObject 对象传递给它。在 parseJson 方法,我们遍历 JSON 对象的所有键,并检查每个键所对应的的类型。 如果是一个 JSON 对象,则我们递归调用 parseJson 方法,将该转换为 JSONObject 对象,并继续解析它。如果是一个 JSON 数组,则我们遍历它并递归解析其的每个元素。最后,如果是一个基本类型,则我们输出它。 注意:在使用基于递归的方法解析 JSON 数据时,需要小心处理嵌套的 JSON 对象和数组,以避免出现无限递归的情况。 ### 回答2: Java 递归解析 JSON 是指使用 Java 编程语言递归算法来解析 JSON 数据。JSONJavaScript 对象表示法)是一种常用的数据交换格式,通常用于在不同的平台之间传递数据。 使用递归算法解析 JSON 数据可以实现对嵌套层次较深的复杂 JSON 对象的解析。主要思路是通过递归函数来遍历 JSON 数据的各个层次,并进行相应的操作。 在实际实现,可以先将 JSON 数据转换为 JavaJSON 对象或数组。然后,通过递归函数对 JSON 对象进行遍历,判断当前元素的类型,如果是基本类型,则直接读取其;如果是对象类型,则继续递归解析;如果是数组类型,则对每个元素继续递归解析。 递归解析 JSON 的步骤通常包括以下几个方面: 1. 判断当前元素的类型,包括基本类型、对象类型和数组类型。 2. 如果是基本类型,直接读取其,进行相应的处理。 3. 如果是对象类型,则对每个键对进行递归解析,可以使用迭代或者递归的方式。 4. 如果是数组类型,则对数组的每个元素进行递归解析,同样可以使用迭代或者递归的方式。 5. 对解析结果进行处理,可以是输出结果或者其他进一步的操作。 递归解析 JSON 数据可以帮助开发者更方便地提取需要的数据,特别适用于复杂数据结构的 JSON 对象。不过需要注意的是,在使用递归算法解析 JSON 数据时,要确保数据格式的正确性,以避免解析出现错误。 ### 回答3: 在Java,可以使用递归方法来解析JSON数据。首先,我们需要使用JSON库(如JSON.org、Gson、Jackson等)来解析JSON字符串。以下是一种基本的递归解析JSON的方法: 1. 创建一个方法,输入参数为JSON字符串和JSON库对象。 2. 在方法内部,将JSON字符串转换为JSON对象。 3. 检查JSON对象的类型: - 如果是基本类型(如字符串、数字、布尔等),则可以直接使用相应的方法获取和处理该。 - 如果是数组类型,则需要获取数组的长度,并使用循环递归处理每个数组元素。 - 如果是对象类型,则需要获取对象的所有字段,并使用循环递归处理每个字段的。 4. 对于每个字段,可以使用递归方法来进一步解析其。如果是基本类型,则可以直接处理;如果是数组或对象类型,则继续递归处理。 5. 处理完所有字段后,可以输出结果或将结果存储在合适的数据结构。 例如,以下是一个简单的递归解析JSON的示例: ```java import org.json.JSONObject; public class JSONParser { public static void parseJSON(String jsonString) { JSONObject jsonObject = new JSONObject(jsonString); parseJSONObject(jsonObject); } private static void parseJSONObject(JSONObject jsonObject) { for (String key : jsonObject.keySet()) { Object value = jsonObject.get(key); if (value instanceof JSONObject) { parseJSONObject((JSONObject) value); } else if (value instanceof JSONArray) { parseJSONArray((JSONArray) value); } else { // 处理基本类型 System.out.println(key + ": " + value); } } } private static void parseJSONArray(JSONArray jsonArray) { for (int i = 0; i < jsonArray.length(); i++) { Object value = jsonArray.get(i); if (value instanceof JSONObject) { parseJSONObject((JSONObject) value); } else if (value instanceof JSONArray) { parseJSONArray((JSONArray) value); } else { // 处理基本类型 System.out.println(value); } } } public static void main(String[] args) { String jsonString = "{"name":"John","age":30,"city":"New York"}"; parseJSON(jsonString); } } ``` 在上面的示例,我们首先将JSON字符串转换为JSONObject对象,然后使用递归方法来解析JSON的所有字段和。对于基本类型,我们直接输出;对于复杂类型(数组或对象),我们继续递归解析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值