瀏覽代碼

小工具

lighter 3 年之前
父節點
當前提交
b313b8a455
共有 1 個文件被更改,包括 16 次插入215 次删除
  1. 16 215
      src/main/java/thyyxxk/webserver/utils/CampareJson.java

+ 16 - 215
src/main/java/thyyxxk/webserver/utils/CampareJson.java

@@ -1,229 +1,30 @@
-package com.watertour.service;
+package thyyxxk.webserver.utils;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import thyyxxk.webserver.entity.login.UserInfo;
 
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.*;
 
 public class CampareJson {
     public static void main(String[] args) {
-        String oldStr = "{a:'aaa',b:'bbb'}";
-        String newStr = "{a:'aa',b:'bb'}";
-        System.out.println(new CampareJson().campareJsonObject(oldStr, newStr));
+        UserInfo tt = new UserInfo();
+        UserInfo dd = new UserInfo();
+        tt.setName("aaa").setSid("bbb").setDeptName("ccc").setToken("ddd").setCodeRs("erere").setDeptCode("qwer");
+        dd.setName("aaa").setSid("bcb").setDeptName("zxc").setToken("ddd").setCodeRs("erere").setDeptCode("qwesr");
+        System.out.println(new CampareJson().getChangedFieldsOfObject(tt, dd));
     }
 
-
-    public String campareJsonObject(Object oldJsonStr, Object newJsonStr1) {
-        //将字符串转换为json对象 21312
-        JSON oldJson = JSON.parseObject(oldJsonStr);
-        JSON newJson = JSON.parseObject(newJsonStr1);
-        //递归遍历json对象所有的key-value,将其封装成path:value格式进行比较
-        Map<String, Object> oldMap = new LinkedHashMap<>();
-        Map<String, Object> newMap = new LinkedHashMap<>();
-        convertJsonToMap(oldJson, "", oldMap);
-        convertJsonToMap(newJson, "", newMap);
-        Map<String, Object> differenceMap = campareMap(oldMap, newMap);
-        //将最终的比较结果把不相同的转换为json对象返回
-        String jsonObject = convertMapToJson(differenceMap);
-        return jsonObject;
-    }
-
-    /**
-     * 将json数据转换为map存储用于比较
-     *
-     * @param json
-     * @param root
-     * @param resultMap
-     */
-    private void convertJsonToMap(Object json, String root, Map<String, Object> resultMap) {
-        if (json instanceof JSONObject) {
-            JSONObject jsonObject = ((JSONObject) json);
-            Iterator iterator = jsonObject.keySet().iterator();
-            while (iterator.hasNext()) {
-                Object key = iterator.next();
-                Object value = jsonObject.get(key);
-                String newRoot = "".equals(root) ? key + "" : root + "." + key;
-                if (value instanceof JSONObject || value instanceof JSONArray) {
-                    convertJsonToMap(value, newRoot, resultMap);
-                } else {
-                    resultMap.put(newRoot, value);
-                }
-            }
-        } else if (json instanceof JSONArray) {
-            JSONArray jsonArray = (JSONArray) json;
-            for (int i = 0; i < jsonArray.size(); i++) {
-                Object vaule = jsonArray.get(i);
-                String newRoot = "".equals(root) ? "[" + i + "]" : root + ".[" + i + "]";
-                if (vaule instanceof JSONObject || vaule instanceof JSONArray) {
-                    convertJsonToMap(vaule, newRoot, resultMap);
-                } else {
-                    resultMap.put(newRoot, vaule);
-                }
-            }
-        }
-    }
-
-    /**
-     * 比较两个map,返回不同数据
-     *
-     * @param oldMap
-     * @param newMap
-     * @return
-     */
-    private Map<String, Object> campareMap(Map<String, Object> oldMap, Map<String, Object> newMap) {
-        //遍历newMap,将newMap的不同数据装进oldMap,同时删除oldMap中与newMap相同的数据
-        campareNewToOld(oldMap, newMap);
-        //將舊的有新的沒有的數據封裝數據結構存在舊的裡面
-        campareOldToNew(oldMap);
-        return oldMap;
-    }
-
-    /**
-     * 將舊的有新的沒有的數據封裝數據結構存在舊的裡面
-     *
-     * @param oldMap
-     * @return
-     */
-    private void campareOldToNew(Map<String, Object> oldMap) {
-        //统一oldMap中newMap不存在的数据的数据结构,便于解析
-        for (Iterator<Map.Entry<String, Object>> it = oldMap.entrySet().iterator(); it.hasNext(); ) {
-            Map.Entry<String, Object> item = it.next();
-            String key = item.getKey();
-            Object value = item.getValue();
-            int lastIndex = key.lastIndexOf(".");
-            if (!(value instanceof Map)) {
-                Map<String, Object> differenceMap = new HashMap<>();
-                differenceMap.put("oldValue", value);
-                differenceMap.put("newValue", "");
-                oldMap.put(key, differenceMap);
-            }
-        }
-    }
-
-    /**
-     * 將新的map與舊的比較,並將數據統一存在舊的裡面
-     *
-     * @param oldMap
-     * @param newMap
-     */
-    private void campareNewToOld(Map<String, Object> oldMap, Map<String, Object> newMap) {
-        for (Iterator<Map.Entry<String, Object>> it = newMap.entrySet().iterator(); it.hasNext(); ) {
-            Map.Entry<String, Object> item = it.next();
-            String key = item.getKey();
-            Object newValue = item.getValue();
-            Map<String, Object> differenceMap = new HashMap<>();
-            int lastIndex = key.lastIndexOf(".");
-            String lastPath = key.substring(lastIndex + 1).toLowerCase();
-            if (oldMap.containsKey(key)) {
-                Object oldValue = oldMap.get(key);
-                if (newValue.equals(oldValue)) {
-                    oldMap.remove(key);
-                    continue;
-                } else {
-                    differenceMap.put("oldValue", oldValue);
-                    differenceMap.put("newValue", newValue);
-                    oldMap.put(key, differenceMap);
-                }
-            } else {
-                differenceMap.put("oldValue", "");
-                differenceMap.put("newValue", newValue);
-                oldMap.put(key, differenceMap);
-            }
-        }
-    }
-
-    /**
-     * 将已经找出不同数据的map根据key的层级结构封装成json返回
-     *
-     * @param map
-     * @return
-     */
-    private String convertMapToJson(Map<String, Object> map) {
-        JSONObject resultJSONObject = new JSONObject();
-        for (Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator(); it.hasNext(); ) {
-            Map.Entry<String, Object> item = it.next();
-            String key = item.getKey();
-            Object value = item.getValue();
-            String[] paths = key.split("\\.");
-            int i = 0;
-            Object remarkObject = null;//用於深度標識對象
-            int indexAll = paths.length - 1;
-            while (i <= paths.length - 1) {
-                String path = paths[i];
-                if (i == 0) {
-                    //初始化对象标识
-                    if (resultJSONObject.containsKey(path)) {
-                        remarkObject = resultJSONObject.get(path);
-                    } else {
-                        if (indexAll > i) {
-                            if (paths[i + 1].matches("\\[[0-9]+\\]")) {
-                                remarkObject = new JSONArray();
-                            } else {
-                                remarkObject = new JSONObject();
-                            }
-                            resultJSONObject.put(path, remarkObject);
-                        } else {
-                            resultJSONObject.put(path, value);
-                        }
-                    }
-                    i++;
-                    continue;
-                }
-                if (path.matches("\\[[0-9]+\\]")) {//匹配集合对象
-                    int startIndex = path.lastIndexOf("[");
-                    int endIndext = path.lastIndexOf("]");
-                    int index = Integer.parseInt(path.substring(startIndex + 1, endIndext));
-                    if (indexAll > i) {
-                        if (paths[i + 1].matches("\\[[0-9]+\\]")) {
-                            while (((JSONArray) remarkObject).size() <= index) {
-                                if (((JSONArray) remarkObject).size() == index) {
-                                    ((JSONArray) remarkObject).add(index, new JSONArray());
-                                } else {
-                                    ((JSONArray) remarkObject).add(null);
-                                }
-                            }
-                        } else {
-                            while (((JSONArray) remarkObject).size() <= index) {
-                                if (((JSONArray) remarkObject).size() == index) {
-                                    ((JSONArray) remarkObject).add(index, new JSONObject());
-                                } else {
-                                    ((JSONArray) remarkObject).add(null);
-                                }
-                            }
-                        }
-                        remarkObject = ((JSONArray) remarkObject).get(index);
-                    } else {
-                        while (((JSONArray) remarkObject).size() <= index) {
-                            if (((JSONArray) remarkObject).size() == index) {
-                                ((JSONArray) remarkObject).add(index, value);
-                            } else {
-                                ((JSONArray) remarkObject).add(null);
-                            }
-                        }
-                    }
-                } else {
-                    if (indexAll > i) {
-                        if (paths[i + 1].matches("\\[[0-9]+\\]")) {
-                            if (!((JSONObject) remarkObject).containsKey(path)) {
-                                ((JSONObject) remarkObject).put(path, new JSONArray());
-                            }
-                        } else {
-                            if (!((JSONObject) remarkObject).containsKey(path)) {
-                                ((JSONObject) remarkObject).put(path, new JSONObject());
-                            }
-                        }
-                        remarkObject = ((JSONObject) remarkObject).get(path);
-                    } else {
-                        ((JSONObject) remarkObject).put(path, value);
-                    }
-                }
-                i++;
+    public List<String> getChangedFieldsOfObject(Object oldObj, Object newObj) {
+        JSONObject oldJson = JSONObject.parseObject(JSON.toJSONString(oldObj));
+        JSONObject newJson = JSONObject.parseObject(JSON.toJSONString(newObj));
+        List<String> resultArray = new ArrayList<>();
+        for (String key : oldJson.keySet()) {
+            if (!newJson.get(key).equals(oldJson.get(key))) {
+                resultArray.add(key);
             }
         }
-        return JSON.toJSONString(resultJSONObject);
+        return resultArray;
     }
 }