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
}
}