json-diff詳細設(shè)計

一倘零、簡介

json-diff是一款強大的,由java編寫的json差異發(fā)現(xiàn)工具。他可以發(fā)現(xiàn)任何結(jié)構(gòu)的json差異绰上,并且將差異信息反饋給用戶。

gitee: https://gitee.com/codeleep/json-diff

教程:https://juejin.cn/post/7210003299109109818

給大家提供一個設(shè)計json-diff的實現(xiàn)思路渠驼,用于發(fā)現(xiàn)json的差異蜈块,對比json。

二迷扇、需求

  • 精準定位差異所在

  • 詳細的差異位置

  • 能支持豐富的差異過程控制

1. 基礎(chǔ)設(shè)計

1.1 json 結(jié)構(gòu)抽象

我們知道百揭,在 json 中,只存在三種結(jié)構(gòu)蜓席。

  • 數(shù)組[] :數(shù)組元素可以由任意 json 結(jié)構(gòu)組成器一。

  • 對象{}:對象是一個 key-value 的列表。key 只由字符串組成, value 可由任意 json 結(jié)構(gòu)組成

  • 數(shù)據(jù)單元: 一個最小數(shù)據(jù)單元厨内∑盹酰可以是 String , Number等基礎(chǔ)結(jié)構(gòu)

為了簡化,我們簡單的認為 對象的 key 只由字符串組成雏胃,value 可由任意 json 結(jié)構(gòu)組成

這樣我們就得到了一個基礎(chǔ)的概念请毛。json 結(jié)構(gòu)中,只有 數(shù)組的 item 和 對象的 value 存在變化丑掺。且變化范圍是 json 結(jié)構(gòu)获印,也就是上述三種結(jié)構(gòu)。

1.2 遍歷模型抽象

為了將復雜的問題拆解成若干個小問題街州,我們就需要高度抽象整個過程重復過程兼丰。

既然上述將數(shù)據(jù)抽象成一個規(guī)范的結(jié)果,也明確知道只有 數(shù)組的 item 和 對象的 value 存在變化唆缴。那我們對不變化的部分做硬編碼鳍征,對變化的部分做適配即可。

也就是面徽,我們需要抽象出三種數(shù)據(jù)結(jié)構(gòu)的處理器:

  • 數(shù)組處理器 (ComplexArrayJsonNeat):處理json數(shù)組結(jié)構(gòu)艳丛。遍歷數(shù)組匣掸,比較元素
  • 對象處理器 (ComplexObjectJsonNeat):處理json對象結(jié)構(gòu)。遍歷所有key氮双,比較value
  • 數(shù)據(jù)單元處理器 (PrimitiveTypeJsonNeat):直接對比兩個數(shù)據(jù)單元是否一致碰酝。不可向下拆分

有了三種處理器之后,我們就可以設(shè)計出以下這種遍歷結(jié)構(gòu)戴差。

image-20230314213858281

上圖中的遍歷結(jié)構(gòu)結(jié)束的條件只有遍歷出所有的基礎(chǔ)單元送爸,這就是工具最核心的設(shè)計。其實看起來就很簡單暖释。

圖中有一個 Json結(jié)構(gòu)處理器 其實內(nèi)部很簡單袭厂,根據(jù)傳入的 expect節(jié)點actual節(jié)點 判斷需要以什么類型處理器進行處理。當然避免不了多個 if 球匕。

這樣設(shè)計的好處是我們可以將所有的節(jié)點在方法棧中獨立纹磺,就不會存在數(shù)據(jù)污染問題,也會將問題簡化亮曹。但所帶來的開銷即是需要創(chuàng)建較多的相同對象橄杨。

2. 功能豐富

基于上述的遍歷模型,可以在其過程中進行很多外在干預照卦。

2.1 數(shù)組

  • 忽略數(shù)組順序:對于數(shù)組遍歷 item 過程可以將數(shù)組順序忽略讥珍。

2.2 對象

  • key 映射:可以支持 expect節(jié)點actual節(jié)點 中使用不同的 keyvalue 進行對比。比如將 expect 對象中的 a 字段與 actual 對象的 b 字段進行對比
  • key 忽略:如果不想關(guān)注某個 key 窄瘟,可以支持該需求

2.3 基礎(chǔ)單元

  • 支持所有java中的基礎(chǔ)類型,即jdk中重寫了eques的類

2.4 處理器前置檢測

  • 忽略路徑:指定的路徑不比較

2.5 其他

  • 支持自定義處理器
  • 支持只關(guān)心結(jié)構(gòu)變化

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布趟卸!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹄葱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锄列,更是在濱河造成了極大的恐慌图云,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邻邮,死亡現(xiàn)場離奇詭異竣况,居然都是意外死亡,警方通過查閱死者的電腦和手機筒严,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門丹泉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸭蛙,你說我怎么就攤上這事摹恨。” “怎么了娶视?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵晒哄,是天一觀的道長睁宰。 經(jīng)常有香客問我,道長寝凌,這世上最難降的妖魔是什么柒傻? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮较木,結(jié)果婚禮上红符,老公的妹妹穿的比我還像新娘。我一直安慰自己劫映,他們只是感情好违孝,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泳赋,像睡著了一般雌桑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祖今,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天校坑,我揣著相機與錄音,去河邊找鬼千诬。 笑死耍目,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的徐绑。 我是一名探鬼主播邪驮,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼傲茄!你這毒婦竟也來了毅访?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤盘榨,失蹤者是張志新(化名)和其女友劉穎喻粹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體草巡,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡守呜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了山憨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片查乒。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖萍歉,靈堂內(nèi)的尸體忽然破棺而出侣颂,到底是詐尸還是另有隱情,我是刑警寧澤枪孩,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布憔晒,位于F島的核電站藻肄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拒担。R本人自食惡果不足惜嘹屯,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望从撼。 院中可真熱鬧州弟,春花似錦、人聲如沸低零。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掏婶。三九已至啃奴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雄妥,已是汗流浹背最蕾。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留老厌,地道東北人瘟则。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像枝秤,于是被迫代替她去往敵國和親醋拧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容