91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中json-diff簡單使用及對象是否一致源碼分析

發布時間:2023-03-22 13:58:49 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

本篇內容介紹了“java中json-diff簡單使用及對象是否一致源碼分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    一、摘要

    今天推薦的是一款java中,對比兩個json-diff對象是否一致的工具包 json-diff` 。他可以對比任何結構的兩個json數據,并且將其中的不一致信息反饋給用戶。工具還內置了很多配置可以來控制對比過程中的行為。目前已經補充大量單測,穩定性還是比較好的。

    二、背景

    公司最近在重構一個核心系統,至于為什么重構原因很多,就不說明了。但是這個核心系統承載較多的線上業務。為了不影響依賴依賴該服務的應用,所以我們重構的最核心就是完全兼容老系統接口。

    為了保證平滑上線,并且測試新系統與老系統是否一致,我們決定系統并行一段時間,并且在這段時間之中驗證新接口對老接口的兼容性。我們新起一個代理服務,他會將我們的用戶流量分別轉發到新老接口,然后拿到兩個結果,將老接口結果直接返回;異步去比較新老結果是否符合預期,進行記錄或者報警。

    這樣系統在經過一段時間的測試,穩定性更高,出錯的概率更小。

    java中json-diff簡單使用及對象是否一致源碼分析

    因為系統都是采用http接口對外提供服務,且返回數據格式統一的是json格式。所以我們急需一款強大的Java語言的Json對比工具來幫助我們發現新老系統的不兼容之處。

    三、工具介紹

    1. 介紹

    json-diff 是一款功能強大的json差異發現工具,支持任何結構的json對比,并且可以將對比結果返給用戶。目前該工具更新到了 3.0.0-RC1-RELEASE 版本。最新版可以查看 版本列表 。建議使用最新版,舊版可能存在缺陷。

    優點:

    • 輕量級:工具只依賴 fastjson2

    • 精準定位:可以返回最精準且詳細的信息

    • 功能全面:幾乎覆蓋任何json結構

    • 高性能

    2. 使用教程

    2.1 快速開始
    • 引入依賴

    <dependency>
        <groupId>cn.xiaoandcai</groupId>
        <artifactId>json-diff</artifactId>
        <!-- 舊版本可能存在某些缺陷。版本請以maven倉庫最版為準。 -->
        <version>${version}</version>
    </dependency>

    版本查看 2022-03-04 最新版本:3.0.0-RC1-RELEASE

    • 開始使用

    /**
     * @author: codeleep
     * @createTime: 2022/11/22 16:57
     * @description: 使用示例
     */
    public class UseExample {
        public static void main(String[] args) {
            String array1 = "[1, 2, 3, 4, 5]";
            String array2 = "[1, 3, 9, 4, 5]";
            JsonComparedOption jsonComparedOption = new JsonComparedOption().setIgnoreOrder(true);
            JsonCompareResult jsonCompareResult = new DefaultJsonDifference()
                    .option(jsonComparedOption)
                    .detectDiff(JSON.parseArray(array1), JSON.parseArray(array2));
            System.out.println(JSON.toJSONString(jsonCompareResult));
        }
    }

    結果展示:

    {
        "defectsList": [
            {
                "actual": 9,
                "expect": 2,
                "illustrate": "The expect('2') data is inconsistent with the actual('9') data",
                "travelPath": {
                    "abstractTravelPath": "root[]",
                    "actualTravelPath": "root[2]",
                    "expectTravelPath": "root[1]"
                }
            }
        ],
        "match": false
    }

    工具會返回 match 表示是否通過比對。defectsList 則是對比信息。

    2.2 更多配置
    配置類型備注
    ignoreOrderboolean是否比較過程中忽略數組順序
    mappingMap<String, String>將真實字段映射到期望字段,key是真實字段name,value是期望的字段name
    ignorePathSet<String>當對比的路徑完全匹配時會被跳過。遇到數組使用 [] 即可。無需填入下標
    ignoreKeySet<String>對比object時。或忽略該key。對整個json生效
    customComparatorMap<String, Class<JsonNeat>>用戶自定義比較器。具體說明見下文

    2.0.1-RC1-RELEASE 之后版本中移除了 keyFunction 配置參數。可以使用 ignorePath 來代替達到同樣的效果。

    工具提供了四個配置,來之對比過程中一些其他的要求。工具還在積極開發中,如果有新的需求,可以給作者提一個issuse。

    在開發中。很多時候對比配置一致。可以使用 JsonDiffOption 進行開啟唯一配置

    3. 進階

    3.1. 全局使用固定配置

    由于在設計中考慮到各線程比較配置相互獨立。所以默認將配置防止在 ThreadLocal 中進行存儲。但在大多數情況下,我們在全局比較時,配置并不會發生變化。

    工具提供了全局配置方式。采用的方式是靜態類屬性。這樣也會獲得更好的性能。

    // 開啟并設置全局配置
    JsonDiffOption.openUniqueOption();
    JsonDiffOption.setGloballyUniqueOption(new JsonComparedOption());
    // 不想使用時可以調用調整回線程獨有模式
     JsonDiffOption.closeUniqueOption();
    3.2. 數組元素為對象關聯

    當我們在遇到數組元素是一個對象時。如下:

    [    {        "date": "23日星期五",        "sunrise": "06:16",        "high": "高溫 18.0℃"    },    {        "date": "24日星期六",        "sunrise": "06:14",        "high": "高溫 21.0℃"    }]

    在比較時, 如果希望 date 字段一致,則認為兩個對象一致。那么可以將 sunrise, high 字段都配置到 ignorePath 中。如:

    HashSet<String> ignorePath = new HashSet<>();
    ignorePath.add("root[].sunrise");
    ignorePath.add("root[].high");

    如果只是不想關注某個字段。即是 ignorePath 正常用法。配置如上。

    3.3. 字段映射

    在比較兩個對象時。也許由于字段名變更。導致校驗不通過。這時可以使用 mapping 配置。將 真實字段名稱映射至期望字段名稱。在比較過程中會將

    actual.mappingKey 與 expect.mappingValue 認為是應該比較的對象。具體配置如下

    // mapping key 是 actual 鍵名
    // mapping value 是 expect 鍵名
    HashMap<String, String> mapping = new HashMap<>();
    mapping.put("date", "sunrise");
    3.4. 字段忽略

    如果有一些字段是想在整個json都進行忽略的,可以使用 ignoreKey 進行全局忽略。當然如果不想全局忽略,但是配置了該項,還是會被忽略掉。

    HashSet&lt;String&gt; ignoreKey = new HashSet&lt;&gt;();
    ignoreKey.add("sunrise");
    ignoreKey.add("high");
    3.5 自定義比較器

    在我們一個大json文件下。可能遇到某些節點希望實現自定義比較。可以通過 customComparator 來進行實現。

    它配置的key是一個 travelPath 。具體格式參照 ignorePath 。value 則是一個自定義比較器。對于自定義比較器需要繼承對應的抽象類。并且實現具體的抽象接口。具體如下:

    對象比較:

    需要繼承 me.codeleep.jsondiff.core.handle.array.AbstractArrayJsonNeat 并且重寫以下方法。

    /**
    * 比較對象
    * @param expect 期望的json對象
    * @param actual 實際的json對象
    * @return 返回比較結果
    * @throws IllegalAccessException 發生異常直接拋出
    */
    JsonCompareResult detectDiff(JSONObject expect, JSONObject actual);

    數組比較:

    需要繼承 me.codeleep.jsondiff.core.handle.object.AbstractObjectJsonNeat 并且重寫以下方法。

      /**
     * 比較數組.調用入口。需要自己去分別調用 ignoreOrder 和  keepOrder。
     * @param expect 期望的json對象
     * @param actual 實際的json對象
     * @return 返回比較結果
     */
    JsonCompareResult detectDiff(JSONArray expect, JSONArray actual);
    // 忽略順序的比較
    JsonCompareResult ignoreOrder(JSONArray expect, JSONArray actual);
    // 保持順序比較
    JsonCompareResult keepOrder(JSONArray expect, JSONArray actual);

    基本類型比較:

    基本類型指的是java基礎類型的包裝類型以及Number的實現類型。

    需要繼承 me.codeleep.jsondiff.core.handle.primitive.AbstractPrimitiveJsonNeat 并且重寫以下方法。

       /**
         * 比較數組
         * @param expect 基礎類型對象
         * @param actual 基礎類型對象
         * @return 返回比較結果
         */
        JsonCompareResult detectDiff(Object expect, Object actual);

    用戶可以自己根據 travelPath 來決定使用何種自定義比較。三種比較器都返回 JsonCompareResult 對象作為當前節點的比較結果。對于JsonCompareResult對象。需要填入以下信息:

    // 示例
    JsonCompareResult result = new JsonCompareResult();
    Defects defects = new Defects()
                      .setActual(actualDiffJson)
                      .setExpect(expectDiffJson)
                      .setTravelPath(nextTravelPath)
                      .setIllustrateTemplate(DATA_TYPE_INCONSISTENT, expectDiffJson.getClass().getName(), actualDiffJson.getClass().getName());
    result.addDefects(defects);

    如果遇到在自定義節點中,還需要使用系統自帶的比較器時。

    // 該值可以在上述三個抽象類中獲得。但需要經自行處理
    String abstractTravelPath = "root";
    // 下一級是對象
    TravelPath nextTravelPath = new TravelPath(abstractTravelPath, mappingKey);
    // 下一級是數組
    TravelPath nextTravelPath = new TravelPath(abstractTravelPath, expectIndex, actualIndex);
    // 獲得比較器
    JsonDiffUtil.getJsonNeat(expectDiffJson, actualDiffJson, nextTravelPath);
    // 執行比較獲得結果
    JsonCompareResult diff = jsonNeat.diff(expectDiffJson, actualDiffJson, nextTravelPath);
    // 本級創建的 JsonCompareResult result 將下一級結果合并
    this.result.mergeDefects(diff.getDefectsList());

    可以使用上述代碼獲取系統自帶的比較器。

    自定義比較器值得注意的是: 從匹配到 travelPath 之后,根據不再接管比較操作。一切行為由用戶自行定義。但工具依然預留默認的比較器給用戶處理后續字段。這需要用戶自行進行組合調用。

    4.其他說明

    前面提到工具幾乎可以支持所有json結果的對比校驗,并且發現差異。那它到底可以支持哪些呢,不知道是否符合你的需求呢?

    • 對象 ?

      這是最簡單的數據結構了,其中元素都以key-value構成,key是字符串,value可以是任何數據結構。

    • 數組 ?

      支持嚴格順序對比和忽略順序對比,可以細化數組元素的類型

      • 基本類型 ?

      • 對象類型 ?

        該類型在對比時,可以通過ignorePath參數進行元素是否進行比較,將不關心的元素忽略掉。當然ignoreKey也可以,但其是全局生效

      • 數組類型 ?

        元素也是數組,這樣就形成了多維數組,工具理論上來說支持n維數組的對比

      • 元素類型不統一 ?

        數組中,類型可能包含前面三種類型,這時工具會按照類型分類進行匹配,最后找不到的元素再反饋給用戶。

    由于json結構在單個看來,就只有對象和數組兩種類型,該工具完美支持了所有類型。

    “java中json-diff簡單使用及對象是否一致源碼分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    连南| 高尔夫| 黔西| 永善县| 离岛区| 革吉县| 沙坪坝区| 九龙坡区| 海城市| 游戏| 铜梁县| 宁海县| 和硕县| 秀山| 隆昌县| 大理市| 周宁县| 塘沽区| 枣阳市| 大城县| 松阳县| 万年县| 会泽县| 朔州市| 高州市| 德清县| 丹东市| 卓尼县| 昭觉县| 江西省| 安泽县| 黎平县| 株洲县| 仙游县| 静海县| 文昌市| 周宁县| 宜良县| 闻喜县| 沅陵县| 海林市|