共计 1256 个字符,预计需要花费 4 分钟才能阅读完成。
一、简介
json-diff 是一款弱小的,由 java 编写的 json 差别发现工具。他能够发现任何构造的 json 差别,并且将差别信息反馈给用户。
gitee: https://gitee.com/local-li/json-diff
教程:https://juejin.cn/post/7210003299109109818
给大家提供一个设计 json-diff 的实现思路,用于发现 json 的差别,比照 json。
二、需要
- 精准定位差别所在
- 具体的差别地位
- 能反对丰盛的差别过程管制
1. 根底设计
1.1 json 构造形象
咱们晓得,在 json
中,只存在三种构造。
数组[]
:数组元素能够由任意json
构造组成。对象{}
:对象是一个key-value
的列表。key
只由字符串组成,value
可由任意json
构造组成数据单元
: 一个最小数据单元。能够是String
,Number
等根底构造
为了简化,咱们简略的认为 对象的
key
只由字符串组成,value
可由任意json
构造组成
这样咱们就失去了一个根底的概念。json 构造中,只有 数组的 item
和 对象的 value
存在变动。且变动范畴是 json 构造,也就是上述三种构造。
1.2 遍历模型形象
为了将简单的问题拆解成若干个小问题,咱们就须要高度形象整个过程反复过程。
既然上述将数据抽象成一个标准的后果,也明确晓得只有 数组的 item
和 对象的 value
存在变动。那咱们对不变动的局部做硬编码,对变动的局部做适配即可。
也就是,咱们须要形象出三种数据结构的处理器:
- 数组处理器 (ComplexArrayJsonNeat):解决 json 数组构造。遍历数组,比拟元素
- 对象处理器 (ComplexObjectJsonNeat):解决 json 对象构造。遍历所有 key,比拟 value
- 数据单元处理器 (PrimitiveTypeJsonNeat):间接比照两个数据单元是否统一。不可向下拆分
有了三种处理器之后,咱们就能够设计出以下这种遍历构造。
上图中的遍历构造完结的条件只有遍历出所有的根底单元,这就是工具最外围的设计。其实看起来就很简略。
图中有一个 Json 构造处理器
其实外部很简略,依据传入的 expect 节点
和 actual 节点
判断须要以什么类型处理器进行解决。当然防止不了多个 if。
这样设计的益处是咱们能够将所有的节点在办法栈中独立,就不会存在数据净化问题,也会将问题简化。但所带来的开销即是须要创立较多的雷同对象。
2. 功能丰富
基于上述的遍历模型,能够在其过程中进行很多外在干涉。
2.1 数组
- 疏忽数组程序:对于数组遍历
item
过程能够将数组程序疏忽。
2.2 对象
key
映射:能够反对expect 节点
和actual 节点
中应用不同的key
的value
进行比照。比方将expect
对象中的a
字段与actual
对象的b
字段进行比照key
疏忽:如果不想关注某个key
,能够反对该需要
2.3 根底单元
- 反对所有 java 中的根底类型,即 jdk 中重写了 eques 的类
2.4 处理器前置检测
- 疏忽门路:指定的门路不比拟
2.5 其余
- 反对自定义处理器
- 反对只关怀构造变动