关于后端:jsondiff简单设计

38次阅读

共计 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 节点 中应用不同的 keyvalue 进行比照。比方将 expect 对象中的 a 字段与 actual 对象的 b 字段进行比照
  • key 疏忽:如果不想关注某个 key,能够反对该需要

2.3 根底单元

  • 反对所有 java 中的根底类型,即 jdk 中重写了 eques 的类

2.4 处理器前置检测

  • 疏忽门路:指定的门路不比拟
2.5 其余
  • 反对自定义处理器
  • 反对只关怀构造变动
正文完
 0