本发明涉及一种JSON报文比对方法及系统,特别涉及一种支持自定义比对逻辑的JSON报文比对方法及系统。
背景技术:
现有JSON(一种轻量级的数据交换格式)报文比对方法对JSON格式报文进行逐节点比较,输出不一致的节点名称和节点值,从而定位报文的差异。其缺陷在于判断节点值是否一致的逻辑是固定的,大部分场景下这种方式可以满足需求,但存在一些特定的场景,例如节点值不同但符合某种逻辑关系的被认为是一致的,不希望作为不一致的信息进行输出。然而现有比对方法无法在不修改原比对逻辑的前提下支持这种场景,依旧会当作不一致的信息报出来,扰乱了比对结果,需要人工进行判断,降低了报文比对的效率。
技术实现要素:
本发明要解决的技术问题是为了克服现有技术中JSON报文比对无法支持自定义比对逻辑的缺陷,提供一种JSON报文比对方法及系统。
本发明是通过下述技术方案来解决上述技术问题:
本发明提供了一种JSON报文比对方法,包括以下步骤:
S1、配置需要进行自定义比对的节点路径以及相应的自定义比对逻辑;
S2、在进行JSON报文比对时检测当前比对节点是否存在配置的自定义比对逻辑,若是,则执行步骤S3,若否,则执行步骤S4;
S3、动态解析自定义比对逻辑,并调用自定义比对逻辑对所述当前比对节点进行比对;
S4、按照原始的比对逻辑对所述当前比对节点进行比对。
较佳地,步骤S2之前包括:
S11、开始比对两个JSON报文;
S12、将字符串形式的JSON报文序列化成JSON类型对象并从根节点开始递归比对。
较佳地,步骤S2具体包括:
检测当前比对节点到根节点的路径是否包含于配置的自定义比对的节点路径中,若是,则执行步骤S3,若否,则执行步骤S4。
较佳地,步骤S4具体包括:
S41、判断当前节点是否为JSON类型,若是,则对当前节点的所有孩子节点进行比对,然后返回步骤S2;若否,则执行步骤S42;
S42、判断当前节点是否为数组类型,若是,则对当前数组节点的所有子元素进行比对,然后返回步骤S2;若否,则执行步骤S43;
S43、直接比对节点内容。
较佳地,步骤S1中配置的节点路径为从JSON报文最外层的根节点到自定义比对的节点的完整路径。
本发明的目的在于提供了一种JSON报文比对系统,包括:
配置模块,用于配置需要进行自定义比对的节点路径以及相应的自定义比对逻辑;
检测模块,用于在进行JSON报文比对时检测当前比对节点是否存在配置的自定义比对逻辑,若是,则调用第一比对模块,若否,则调用第二比对模块;
所述第一比对模块用于动态解析自定义比对逻辑,并调用自定义比对逻辑对所述当前比对节点进行比对;
所述第二比对模块用于按照原始的比对逻辑对所述当前比对节点进行比对。
较佳地,所述JSON报文比对系统还包括:
报文比对模块,用于开始比对两个JSON报文;
序列化模块,用于将字符串形式的JSON报文序列化成JSON类型对象并从根节点开始递归比对。
较佳地,所述检测模块用于检测当前比对节点到根节点的路径是否包含于配置的自定义比对的节点路径中,若是,则调用第一比对模块,若否,则调用第二比对模块。
较佳地,所述第二比对模块包括第一判断单元、第二判断单元以及直接比对单元;
所述第一判断单元,用于判断当前节点是否为JSON类型,若是,则对当前节点的所有孩子节点进行比对,然后调用所述检测模块;若否,则调用所述第二判断单元;
所述第二判断单元,用于判断当前节点是否为数组类型,若是,则对当前数组节点的所有子元素进行比对,然后调用所述检测模块;若否,则调用所述直接比对单元;
所述直接比对单元用于直接比对节点内容。
较佳地,所述配置模块配置的节点路径为从JSON报文最外层的根节点到自定义比对的节点的完整路径。
本发明的积极进步效果在于:本发明通过配置需要进行自定义比对的节点路径和相应的比对逻辑代码,原始比对逻辑通过动态解析的方式执行自定义比对逻辑代码,从而在结构上分离了自定义比对逻辑和原始比对逻辑,实现了在无需修改原始比对逻辑的情况下灵活自定义特定节点比对逻辑的效果,大大提升比对方法的灵活性和扩展性,提高了报文比对的效率。
附图说明
图1为本发明较佳实施例的JSON报文比对方法的流程图。
图2为本发明较佳实施例的JSON报文比对系统的模块示意图。
具体实施方式
下面通过实施例的方式进一步说明本发明,但并不因此将本发明限制在所述的实施例范围之中。
如图1所示,本发明的JSON报文比对方法具体包括以下步骤:
步骤101、配置需要进行自定义比对的节点路径以及相应的自定义比对逻辑;
步骤102、在进行JSON报文比对时检测当前比对节点是否存在配置的自定义比对逻辑,若是,则执行步骤103,若否,则执行步骤104;
步骤103、动态解析自定义比对逻辑,并调用自定义比对逻辑对所述当前比对节点进行比对;
步骤104、按照原始的比对逻辑对所述当前比对节点进行比对。
优选地,本发明在步骤101和步骤102之间具体还包括以下步骤:
步骤1011、开始比对两个JSON报文;
步骤1012、将字符串形式的JSON报文序列化成JSON类型对象并从根节点开始递归比对。
而在步骤102中,具体会检测当前比对节点到根节点的路径是否包含于配置的自定义比对的节点路径中,若是,则执行步骤103,若否,则执行步骤104。
而在步骤104中,其具体会进一步执行如下步骤:
步骤1041、判断当前节点是否为JSON类型,若是,则对当前节点的所有孩子节点进行比对,然后返回步骤102;若否,则执行步骤1042;
步骤1042、判断当前节点是否为数组类型,若是,则对当前数组节点的所有子元素进行比对,然后返回步骤102;若否,则执行步骤1043;
步骤1043、直接比对节点内容。
其中,步骤101中配置的节点路径具体为从JSON报文最外层的根节点到自定义比对的节点的完整路径。
本发明与现有技术的共同点在于都是对JSON报文进行全节点比对,发现节点内容不同则作为差异报出。区别在于增加了自定义比对逻辑的配置,从而支持在特定场景下不同于正常比对逻辑的比对方式,此方式同时实现了自定义比对逻辑与原始比对逻辑分离的目的。
在本发明的具体实施过程中,原始的JSON报文比对逻辑可以使用java语言实现,自定义的比对逻辑可以使用JavaScript语言实现,两种语言用于处理JSON都很便利。
首先配置需要进行自定义比对的节点和相应的比对逻辑代码,保存到文件或数据库中。配置的节点路径为从JSON报文最外层的根节点到自定义比对节点的完整路径,比对逻辑代码为符合如下形式的JavaScript代码:
要求代码中声明一个函数,接收两个字符串参数,返回值为布尔值,函数体为任意自定义的比对逻辑,例如可以通过JavaScript中的JSON.parse() 方法把字符串参数转换为JSON对象进行比对,也可以直接对JSON字符串进行分析,而具体的比对方式和标准是完全自定义的。
使用Java语言实现的原始JSON报文比对逻辑与现有技术的比对方法大致相同,首先利用第三方JSON库(例如org.JSON)把字符串形式的JSON报文反序列化成JSON类型对象,然后对JSON对象从根节点递归比较,比对过程中记录当前比对节点的路径,比对时根据当前比对节点的类型来选择具体的比对策略,如果是JSON类型则继续递归比较其所有子节点,若为数组类型则遍历比较所有数组元素,其他类型则为基本数据类型,可以直接进行比较。
与现有技术的不同点在于,根据当前比对节点的路径和之前的配置判断是否存在自定义比对逻辑,没有则按照上述原始逻辑比较,否则就按照自定义比对逻辑进行,具体方法为:从文件或数据库中取出当前比对节点对应的JavaScript比对逻辑代码,通过Java中的JavaScript引擎解析调用执行,代码如下:
ScriptEngine engine=newScriptEngineManager().getEngineByName("nashorn");
engine.eval(selfDefineCompareLogic);
Invocable invocable=(Invocable)engine;
boolean result=(boolean)invocable.invokeFunction("selfDefineCompareFunc", JSONStr1,JSONStr2);
上述代码中selfDefineCompareLogic即为自定义的比对逻辑代码字符串, JavaScript引擎动态解析调用其中的selfDefineCompareFunc方法,传入当前比对节点的字符串JSONStr1、JSONStr2作为方法参数,得到布尔类型的返回值,即在自定义比对逻辑下节点是否相等的结果。
通过上述实现方式,做到了原始JSON比对逻辑与自定义比对逻辑的分离,大大提升了比对方法的灵活性和扩展性,提高了JSON报文比对的效率。
本发明还还提供了一种JSON报文比对系统,包括配置模块1、检测模块 2、第一比对模块3、第二比对模块4;
所述配置模块1,用于配置需要进行自定义比对的节点路径以及相应的自定义比对逻辑;
所述检测模块2,用于在进行JSON报文比对时检测当前比对节点是否存在配置的自定义比对逻辑,若是,则调用第一比对模块3,若否,则调用第二比对模块4;
所述第一比对模块3用于动态解析自定义比对逻辑,并调用自定义比对逻辑对所述当前比对节点进行比对;
所述第二比对模块4用于按照原始的比对逻辑对所述当前比对节点进行比对。
优选地,本发明的JSON报文比对系统还包括报文比对模块5以及序列化模块6;所述报文比对模块5,用于开始比对两个JSON报文;所述序列化模块6,用于将字符串形式的JSON报文序列化成JSON类型对象并从根节点开始递归比对。
其中,所述检测模块具体用于检测当前比对节点到根节点的路径是否包含于配置的自定义比对的节点路径中,若是,则调用第一比对模块,若否,则调用第二比对模块。
所述第二比对模块4包括第一判断单元41、第二判断单元42以及直接比对单元43;
所述第一判断单元41,用于判断当前节点是否为JSON类型,若是,则对当前节点的所有孩子节点进行比对,然后调用所述检测模块;若否,则调用所述第二判断单元42;
所述第二判断单元42,用于判断当前节点是否为数组类型,若是,则对当前数组节点的所有子元素进行比对,然后调用所述检测模块;若否,则调用所述直接比对单元43;
所述直接比对单元43用于直接比对节点内容。
其中,所述配置模块配置的节点路径具体为从JSON报文最外层的根节点到自定义比对的节点的完整路径。
虽然以上描述了本发明的具体实施方式,但是本领域的技术人员应当理解,这仅是举例说明,本发明的保护范围是由所附权利要求书限定的。本领域的技术人员在不背离本发明的原理和实质的前提下,可以对这些实施方式做出多种变更或修改,但这些变更和修改均落入本发明的保护范围。