背景

考虑到业务需求,需要把JSON转Map写了两个工具类(也有参考别的代码)

兼容了数组和对象混合的JSON

需要注意Map的key不能重复

Map存JSON的所有key

/**
     * map包括全量的节点
     * @param objJson
     * @param map
     * @param k 递归的时候默认用.  入参的时候传空字符串即可
     * @return
     */
    public static Map<String,String> analysisJson2ALL(Object objJson, Map map, String k){
        //如果obj为json数组
        if(objJson instanceof JSONArray){
            JSONArray objArray = (JSONArray)objJson;
            for (int i = 0; i < objArray.size(); i++) {
                analysisJson2ALL(objArray.get(i),map, k + "");
            }
        } else if(objJson instanceof JSONObject){
            JSONObject jsonObject = (JSONObject)objJson;
            Set<String> set = jsonObject.keySet();
            for (String field : set) {
                if (!StringUtils.hasText(field)){
                    continue;
                }
                String key=k + field; //每个属性新key ,递归如何?
                Object object = null;
                try{
                    object=JSONObject.parse(jsonObject.getString(field));
                    //如果得到的是数组
                    if(object instanceof JSONArray){
                        JSONArray objArray = (JSONArray)object;
                        map.put(key,JSONObject.toJSONString(object));
                        analysisJson2ALL(objArray,map, key + ".");
                    }
                    //如果key中是一个json对象
                    else if(object instanceof JSONObject){
                        map.put(key,JSONObject.toJSONString(object));
                        analysisJson2ALL(object,map, key + ".");
                    }
                    //如果key中是其他
                    else{
                        if (key!=null&&object!=null){
                            map.put(key,object+"");
                        }
                    }
                }catch (Exception e){
                    if (key!=null&&jsonObject.getString(field)!=null){
                        map.put(key,jsonObject.getString(field));
                    }
                }
            }
        }
        return map;
    }

Map只存叶子结点的key

/**
     * 只会取叶子节点
     * @param objJson
     * @param map
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Map<String,String>  analysisJson(Object objJson,Map map){
        //如果obj为json数组
        if(objJson instanceof JSONArray){
            JSONArray objArray = (JSONArray)objJson;
            for (int i = 0; i < objArray.size(); i++) {
                analysisJson(objArray.get(i),map);
            }
        } else if(objJson instanceof JSONObject){
            JSONObject jsonObject = (JSONObject)objJson;
            Set<String> set = jsonObject.keySet();
            Iterator it =set.iterator();
            while(it.hasNext()){
                String key = it.next().toString();
                Object object = jsonObject.get(key);
                //如果得到的是数组
                if(object instanceof JSONArray){
                    JSONArray objArray = (JSONArray)object;
                    analysisJson(objArray,map);
                }
                //如果key中是一个json对象
                else if(object instanceof JSONObject){
                    analysisJson(object,map);
                }
                //如果key中是其他
                else{
                    map.put(key,object.toString());
                }
            }
        }
        return map;
    }