Java解析多层复杂JSON---JSON循环嵌套后递归替换原有key,删除json一条数据。

JSON数据中分为三种:

1、value为JSON类型

“key":0 --> 此时value为int
“key”:“aaa” --> 此时value为String

2、value为JSONObject

 “key”:{“k1”:“v1”} --> 此时value为JSONObject

3、value为JSONArray

第一个value里面是List数组

第二个value里面是JSONObject

“key”: [ "Google", "Runoob", "Taobao" ] 

"key": [
                {
                    "title": "穿衣",
                    "zs": "较冷",
                    "tipt": "穿衣指数",
                    "des": "建议着厚外套加毛衣等服装。"
                },
                {
                    "title": "紫外线强度",
                    "zs": "中等",
                    "tipt": "紫外线强度指数",
                    "des": "建议涂擦防晒护肤品,戴帽子、太阳镜。"
                }
            ]

思路:

思路是写一个递归函数,value里面分三种情况,

  • 1.value是JSONObject类型就继续找
  • 2.如果是JSONArray数组,就遍历之后递归
  • 3,如果是普通类型就continue

代码部分:

@RestController
@RequestMapping("/axa/data/json")
public class ParsingJsonController {

    //展示JSON数据列表
    @PostMapping("/show")
    public List<jsonItem> showJson(@RequestBody KeyParam keyParam){
        Assert.isTrue(null != keyParam,"keyParam null");
        String data = keyParam.getData();
        ResolutionType type = keyParam.getType();
        Assert.isTrue(null != data,"data null");
        Assert.isTrue(null != type,"type null");

        if (type.getTypeName() == "LOG_JSON") {
            List<jsonItem> res = new ArrayList<>();
            //json解析的数据存入Setup对象,展示
            Map<String, Object> stringObjectMap = showJson(data);
            for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();
                jsonItem jsonItem = new jsonItem();
                jsonItem.setKey(key);
                jsonItem.setValue(value);
                jsonItem.setParsingTime(DateUtils.getNowDate());//获取当前时间
                jsonItem.setType("String"); //获取key的类型
                res.add(jsonItem);
            }
            return res;
        }else {
            return null;
        }
    }

    //实现JSON的RenameKey,删除的功能
    @PostMapping ("/parsing")
    public AjaxResult resolve(@RequestBody RenameKeyParam renameKeyParam) {
        Assert.isTrue(null != renameKeyParam,"renameKeyParam null");
        String data = renameKeyParam.getData();
        ResolutionType type = renameKeyParam.getType();
        List<jsonItem> list = renameKeyParam.getList();
        Assert.isTrue(null != data,"renameKeyParam null");
        Assert.isTrue(null != type,"renameKeyParam null");
        Assert.isTrue(null != list,"renameKeyParam null");

        if (type.getTypeName() == "LOG_JSON") {
            Map<String, String> keyMap = new HashMap<>();
            for (jsonItem jsonItem : list) {
                String key = jsonItem.getKey();
                String renameKey = jsonItem.getRenameKey();
                Integer deleteKey = jsonItem.getDeleteKey();
                //需要重新命名
                if (!StringUtils.isEmpty(renameKey)){
                    keyMap.put(key,renameKey);
                }
                //如果要删除
                if (!StringUtils.isEmpty(deleteKey)){
                    if (deleteKey.equals(1)){
                        keyMap.put(key,"del");
                    }
                }
            }
            //解析JSON字符串,并返回JSON格式
            JSONObject json = analyseJson(data, keyMap);
            //return AjaxResult.success(JSONObject.toJSONString(json));
            return AjaxResult.success(json);

        }  else {
            return AjaxResult.error();
        }
    }


    /**
     * RenameKey 和 Delete数据
     * @param jsonData
     * @param keyMap
     * @return
     */
    public static JSONObject analyseJson(String jsonData, Map<String, String> keyMap) {
        SortedMap<String, Object> map = new TreeMap<>();
        JSONObject jsonObject = JSON.parseObject(jsonData);

        //1. 获取所有的Key,得到key对应的value
        for (String key : jsonObject.keySet()) {
            //在此判断==》如果没有要替换的值,resKey就为原值,否则为要替换的值
            String resKey = keyMap.get(key) == null ? key : keyMap.get(key);
            Object value = jsonObject.get(key);
            //实现删除功能
            if (resKey.equals("del")){
                map.remove(resKey);
            //实现替换key的功能
            }else{
                //1.1 如果value为JSONArray类型,则解析
                if (value instanceof JSONArray) {
                    JSONArray jsonArray = new JSONArray(new LinkedList<>());
                    JSONArray array = jsonObject.getJSONArray(key);
                    for (int i = 0; i < array.size(); i++) {
                        Object object = array.get(i);
                        //如果value里面是List: ["aaa","bbb","ccc"]; 或者是value里面是JSONObject[{},{},{}]
                        if (object instanceof String){
                            map.put(resKey,array);
                            //jsonArray.add(array);
                        }else {
                            JSONObject sortJson = analyseJson(String.valueOf(object),keyMap);
                            jsonArray.add(sortJson);
                            map.put(resKey,jsonArray);
                        }
                    }

                //2.2 如果value为JSONObject类型,则解析
                } else if (value instanceof JSONObject) {
                    JSONObject sortJson = analyseJson(String.valueOf(value), keyMap);
                    map.put(resKey, sortJson);

                //2.3 如果value为JSON类型,则装入map
                } else {
                    map.put(resKey,value);
                }
            }
        }
        return new JSONObject(map);
    }

    //展示JSON列表数据
    public static Map<String, Object> showJson(String jsonData) {
        Map<String, Object> map = new HashMap<>();
        JSONObject jsonObject = JSON.parseObject(jsonData);
        //1. 获取所有的Key,得到key对应的value
        for (String key : jsonObject.keySet()) {
            Object value = jsonObject.get(key);
            //2.1 如果value为JSONArray类型,则解析
            if (value instanceof JSONArray) {
                JSONArray jsonArray = new JSONArray(new LinkedList<>());
                JSONArray array = jsonObject.getJSONArray(key);
                for (int i = 0; i < array.size(); i++) {
                    Object object = array.get(i);
                    //如果value里面是List: ["aaa","bbb","ccc"]; 或者是value里面是JSONObject[{},{},{}]
                    if (object instanceof String){
                        map.put(key,array);
                        //jsonArray.add(array);
                    }else {
                        Map<String, Object> stringObjectMap = showJson(String.valueOf(object));
                        for (Map.Entry<String, Object> entry : stringObjectMap.entrySet()) {
                            map.put(entry.getKey(), entry.getValue());
                        }
                        jsonArray.add(stringObjectMap);
                        map.put(key,jsonArray);
                    }
                }
            //2.2 如果value为JSONObject类型,则解析
            } else if (value instanceof JSONObject) {
                Map<String, Object> stringObjectMap = showJson(String.valueOf(value));
                map.put(key, stringObjectMap);

            //2.3 如果value为JSON类型,则装入map
            } else {
                map.put(key, value);
            }
        }
        return new JSONObject(map);
    }
}

测试部分

准备JSON数据

{
    "severity":3,
    "eventid":258759,
    "log_filename":"/data/scripts/zabbix-docker-5.4/zbx_env/var/lib/zabbix/export/problems-history-syncer-*.ndjson",
    "ns":712397047,
    "hosts":
    [
        {
            "host":"192.168.100.181",
            "name":"算法开发环境-dev01-100.181"
        }
    ],
    "groups":["算法开发环境","bbb"],
    "clock":1659336810,
    "tags":
    [
        {
            "tag":"Application",
            "value":"CPU"
        },
        {
            "tag":"VM",
            "value":"linux"
        }
    ],
    "log_service":"zabbix_problem",
    "user_system":"monitor",
    "name":"Load average is too high (per CPU load over 1.5 for 5m)",
    "value":1
}

需求:实现RenameKey,删除一条数据的效果

输入:

比如我想改

  • log_filename---》 aaa

  • host--》ddd

  • tag -- 》删除

Postman测试结果: 

返回结果

{
    "msg": "操作成功",
    "code": 200,
    "data": {
        "aaa": "/data/scripts/zabbix-docker-5.4/zbx_env/var/lib/zabbix/export/problems-history-syncer-*.ndjson",
        "clock": 1659336810,
        "eventid": 258759,
        "groups": [
            "算法开发环境",
            "bbb"
        ],
        "hosts": [
            {
                "ddd": "192.168.100.181",
                "name": "算法开发环境-dev01-100.181"
            }
        ],
        "log_service": "zabbix_problem",
        "name": "Load average is too high (per CPU load over 1.5 for 5m)",
        "ns": 712397047,
        "severity": 3,
        "tags": [
            {
                "value": "CPU"
            },
            {
                "value": "linux"
            }
        ],
        "user_system": "monitor",
        "value": 1
    }
}

java解析json字符串。 commons-beanutils-1.9.0 commons-collections-3.2.1 commons-lang-2.6 commons-logging-1.1.3 ezmorph-1.0.6 json-lib-2.4-jdk15 demo: package com; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import net.sf.ezmorph.object.DateMorpher; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JsonConfig; import net.sf.json.util.JSONUtils; public class Jsontest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub JSONObject jsonObj = new JSONObject(); jsonObj.put("name", "hzj"); jsonObj.put("sex", "female"); System.out.println(jsonObj); } public static Object jsonToBean(String jsonString, Class cla) { JSONObject jsonObj = null; try { setDateFormat2Java(); jsonObj = JSONObject.fromObject(jsonString); } catch (Exception ex) { ex.printStackTrace(); } return JSONObject.toBean(jsonObj, cla); } public static Object jsonToBean(String jsonString, Class cla, Map map) { JSONObject jsonObj = null; try { setDateFormat2Java(); jsonObj = JSONObject.fromObject(jsonString); } catch (Exception ex) { ex.printStackTrace(); } return JSONObject.toBean(jsonObj, cla, map); } public static Object[] jsonToArray(String jsonString, Class cla) { Object[] arrObj = null; try { setDateFormat2Java(); JSONArray array = JSONArray.fromObject(jsonString); arrObj = new Object[array.size()]; for (int i = 0; i < array.size(); i++) { JSONObject jsonObject = array.getJSONObject(i); arrObj[i] = JSONObject.toBean(jsonObject, cla); } } catch (Exception ex) { ex.printStackTrace(); } return arrObj; } public static Object[] jsonToArray(String jsonString, Class cla, Map map) { Object[] arrObj = null; try { setDateFormat2Java(); JSONArray array = JSONArray.fromObject(jsonString); arrObj = new Object[array.size()]; for (int i = 0; i < array.size(); i++) { JSONObject jsonObject = array.getJSONObject(i); arrObj[i] = JSONObject.toBean(jsonObject, cla, map); } } catch (Exception ex) { ex.printStackTrace(); } return arrObj; } public static List jsonToList(String jsonString, Class cla) { List list = null; try { setDateFormat2Java(); JSONArray array = JSONArray.fromObject(jsonString); list = new ArrayList(); for (Iterator iter = array.iterator(); iter.hasNext();) { JSONObject jsonObject = (JSONObject) iter.next(); list.add(JSONObject.toBean(jsonObject, cla)); } } catch (Exception ex) { ex.printStackTrace(); } return list; } public static List jsonToList(String jsonString, Class cla, Map map) { List list = null; try { setDateFormat2Java(); JSONArray array = JSONArray.fromObject(jsonString); list = new ArrayList(); for (Iterator iter = array.iterator(); iter.hasNext();) { JSONObject jsonObject = (JSONObject) iter.next(); list.add(JSONObject.toBean(jsonObject, cla, map)); } } catch (Exception ex) { ex.printStackTrace(); } return list; } public static Map jsonToMap(String jsonString) { Map map = null; try { setDateFormat2Java(); JSONObject jsonObject = JSONObject.fromObject(jsonString); map = new HashMap(); for (Iterator iter = jsonObject.keys(); iter.hasNext();) { String key = (String) iter.next(); map.put(key, jsonObject.get(key)); } } catch (Exception ex) { ex.printStackTrace(); } return map; } public static Object[] jsonToArray(String jsonString) { JSONArray jsonArray = JSONArray.fromObject(jsonString); return jsonArray.toArray(); } public static void setDateFormat2Java() { JSONUtils.getMorpherRegistry().registerMorpher( new DateMorpher(new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss" })); } }
下面是一个简单的工具类,可以递归解析多层嵌套JSON 数据: ```java import org.json.JSONArray; import org.json.JSONObject; public class JsonParser { public static void parse(JSONObject json) { for (String key : json.keySet()) { Object value = json.get(key); if (value instanceof JSONObject) { System.out.println("Object: " + key); parse((JSONObject) value); } else if (value instanceof JSONArray) { System.out.println("Array: " + key); parseArray((JSONArray) value); } else { System.out.println(key + ": " + value.toString()); } } } private static void parseArray(JSONArray array) { for (int i = 0; i < array.length(); i++) { Object value = array.get(i); if (value instanceof JSONObject) { System.out.println("Object: " + i); parse((JSONObject) value); } else if (value instanceof JSONArray) { System.out.println("Array: " + i); parseArray((JSONArray) value); } else { System.out.println(i + ": " + value.toString()); } } } } ``` 使用示例: ```java public class TestJsonParser { public static void main(String[] args) { String jsonStr = "{\"name\":\"John\",\"age\":30,\"cars\":[{\"name\":\"Ford\",\"models\":[\"Fiesta\",\"Focus\",\"Mustang\"]},{\"name\":\"BMW\",\"models\":[\"320\",\"X3\",\"X5\"]}],\"address\":{\"street\":\"Downing Street 10\",\"city\":\"London\"}}"; JSONObject json = new JSONObject(jsonStr); JsonParser.parse(json); } } ``` 输出结果: ``` name: John age: 30 Array: cars Object: 0 name: Ford Array: models 0: Fiesta 1: Focus 2: Mustang Object: 1 name: BMW Array: models 0: 320 1: X3 2: X5 Object: address street: Downing Street 10 city: London ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值