相关文章推荐
淡定的盒饭  ·  ASP.NET 核心 Blazor ...·  1 月前    · 
傻傻的馒头  ·  STRING_SPLIT ...·  1 月前    · 
犯傻的黄豆  ·  Branches API | GitLab ...·  1 周前    · 
果断的火腿肠  ·  怎样设计程序从 ...·  2 年前    · 
捣蛋的凉茶  ·  nginx ...·  2 年前    · 
import java . lang . reflect . ParameterizedType ; import java . lang . reflect . Type ; import java . util . ArrayList ; import java . util . HashMap ; import java . util . HashSet ; import java . util . List ; import java . util . Map ; import java . util . Set ; import com . google . gson . Gson ; import com . google . gson . GsonBuilder ; * @author Carpoor * @date 2021年5月19日 public class JsonUtil { public static Set < String > set = new HashSet < > ( ) ; static { set . add ( "String" ) ; set . add ( "Integer" ) ; set . add ( "Double" ) ; public static < T > T str2Obj ( String json , Class < T > clazz ) { Gson gson = new GsonBuilder ( ) . disableHtmlEscaping ( ) . serializeNulls ( ) . create ( ) ; return gson . fromJson ( json , clazz ) ; public static String obj2Str ( Object obj ) { Gson gson = new GsonBuilder ( ) . disableHtmlEscaping ( ) . serializeNulls ( ) . create ( ) ; return gson . toJson ( obj ) ; public static Map jsonCompare ( String currentJson , String expectJson ) { Map < String , String > result = new HashMap < > ( ) ; Map < String , Object > curr = str2Obj ( currentJson , Map . class ) ; Map < String , Object > exp = str2Obj ( expectJson , Map . class ) ; mapProc ( curr , exp , result , "" ) ; return result ; public static void mapProc ( Map < String , Object > curr , Map < String , Object > exp , Map < String , String > result , String keyStr ) { if ( curr . size ( ) != exp . size ( ) ) { result . put ( keyStr == "" ? "首层" : keyStr , String . format ( "key=[%s]Map字段个数不一致,期望为[%s],但当前为[%s]" , keyStr == "" ? "首层" : keyStr , exp . size ( ) , curr . size ( ) ) ) ; for ( String currKey : curr . keySet ( ) ) { String keyStrCopy = keyStr + "." + currKey ; if ( keyStrCopy . indexOf ( "." ) == 0 ) { keyStrCopy = keyStrCopy . substring ( 1 ) ; Object currObj = curr . get ( currKey ) ; //当前为null,对比期望为null 和 不为null两种情况 if ( currObj == null ) { Object expObj = exp . get ( currKey ) ; if ( expObj != null ) { result . put ( keyStrCopy , String . format ( "key=[%s]期望为[%s],但当前为[%s]" , keyStrCopy , expObj , currObj ) ) ; continue ; //当前不为null,对比期望为null的情况 Object expObj = exp . get ( currKey ) ; if ( expObj == null ) { result . put ( keyStrCopy , String . format ( "key=[%s]期望为[%s],但当前为[%s]" , keyStrCopy , expObj , currObj ) ) ; continue ; //类型不一致 if ( ! expObj . getClass ( ) . getSimpleName ( ) . equals ( currObj . getClass ( ) . getSimpleName ( ) ) ) { result . put ( keyStrCopy , String . format ( "key=[%s]类型不匹配,期望为[%s],但当前为[%s]" , keyStrCopy , expObj . getClass ( ) . getSimpleName ( ) , currObj . getClass ( ) . getSimpleName ( ) ) ) ; continue ; if ( set . contains ( currObj . getClass ( ) . getSimpleName ( ) ) ) { if ( ! expObj . equals ( currObj ) ) { result . put ( keyStrCopy , String . format ( "key=[%s]期望为[%s],但当前为[%s]" , keyStrCopy , expObj , currObj ) ) ; else if ( currObj instanceof List ) { List currList = ( List ) currObj ; List expList = ( List ) expObj ; //key对应结果条数不一致 if ( currList . size ( ) != expList . size ( ) ) { result . put ( keyStrCopy , String . format ( "key=[%s]List结果条数不一致,期望为[%s],但当前为[%s]" , keyStrCopy , expList . size ( ) , currList . size ( ) ) ) ; continue ; for ( int i = 0 ; i < currList . size ( ) ; i ++ ) { Object currListObj = currList . get ( i ) ; Object expListObj = expList . get ( i ) ; //List中泛型的类型不匹配 if ( ! currListObj . getClass ( ) . getSimpleName ( ) . equals ( expListObj . getClass ( ) . getSimpleName ( ) ) ) { result . put ( keyStrCopy , String . format ( "key=[%s]List中泛型的类型不匹配,期望为[%s],但当前为[%s]" , keyStrCopy , expListObj . getClass ( ) . getSimpleName ( ) , currListObj . getClass ( ) . getSimpleName ( ) ) ) ; break ; if ( currListObj instanceof Map ) { Map < String , Object > currListMap = ( Map ) currListObj ; Map < String , Object > expListMap = ( Map ) expListObj ; mapProc ( currListMap , expListMap , result , keyStrCopy + "-" + i + "" ) ; else if ( set . contains ( currListObj . getClass ( ) . getSimpleName ( ) ) ) { if ( ! expListObj . equals ( currListObj ) ) { result . put ( keyStrCopy + "-" + i + "" , String . format ( "key=[%s]期望为[%s],但当前为[%s]" , keyStrCopy + "-" + i + "" , expListObj , currListObj ) ) ; else { result . put ( keyStrCopy + "-" + i + "" , String . format ( "key=[%s]List中泛型的类型为[%s],目前未支持,期望为[%s],但当前为[%s]" , keyStrCopy + "-" + i + "" , currListObj . getClass ( ) . getSimpleName ( ) , expListObj , currListObj ) ) ; else if ( currObj instanceof Map ) { Map < String , Object > currListMap = ( Map ) currObj ; Map < String , Object > expListMap = ( Map ) expObj ; mapProc ( currListMap , expListMap , result , keyStrCopy ) ; else { result . put ( keyStrCopy , String . format ( "key=[%s]类型为[%s],目前未支持,期望为[%s],但当前为[%s]" , keyStrCopy , currObj . getClass ( ) . getSimpleName ( ) , expObj , currObj ) ) ; //补 exp多出来的字段差异 exp . forEach ( ( key , value ) - > { if ( ) { //curr中不包含key //result写差异原因 } ) ; public static void main ( String [ ] args ) { Map < String , Object > result = new HashMap < > ( ) ; // test01(); // test02(); result . putAll ( test03 ( ) ) ; for ( String key : result . keySet ( ) ) { System . out . println ( key + " <---> " + result . get ( key ) ) ; public static Map test03 ( ) { System . out . println ( "==================测试多层json-List==========================" ) ; Map < String , Object > exp = new HashMap < > ( ) ; List < Map < String , Object > > expList = new ArrayList < > ( ) ; List < Object > expListSimple = new ArrayList < > ( ) ; Map < String , Object > exp01 = new HashMap < > ( ) ; exp01 . put ( "AA" , "-aa" ) ; exp01 . put ( "AB" , 22 ) ; exp01 . put ( "AC" , 33 ) ; expList . add ( exp01 ) ; Map < String , Object > exp02 = new HashMap < > ( ) ; exp02 . put ( "AA" , "-aa" ) ; exp02 . put ( "AB" , 22 ) ; exp02 . put ( "AC" , 33 ) ; expList . add ( exp02 ) ; expListSimple . add ( 2 ) ; expListSimple . add ( "3" ) ; expListSimple . add ( true ) ; // exp.put("", ""); exp . put ( "A" , "aa" ) ; exp . put ( "B" , expList ) ; exp . put ( "C" , expList ) ; exp . put ( "D" , expListSimple ) ; Map < String , Object > curr = new HashMap < > ( ) ; List < Map < String , Object > > currList = new ArrayList < > ( ) ; List < Object > currListSimple = new ArrayList < > ( ) ; Map < String , Object > curr01 = new HashMap < > ( ) ; curr01 . put ( "AB" , 22 ) ; curr01 . put ( "AC" , 22 ) ; currList . add ( curr01 ) ; Map < String , Object > curr02 = new HashMap < > ( ) ; curr02 . put ( "AA" , "-aa" ) ; curr02 . put ( "AB" , 22 ) ; curr02 . put ( "AC" , 33 ) ; currList . add ( curr02 ) ; currListSimple . add ( 2 ) ; currListSimple . add ( "3" ) ; currListSimple . add ( true ) ; // curr.put("", ""); curr . put ( "B" , currList ) ; curr . put ( "C" , new ArrayList < > ( ) ) ; curr . put ( "D" , currListSimple ) ; String expectJson = obj2Str ( exp ) ; String currentJson = obj2Str ( curr ) ; Map jsonCompare = jsonCompare ( currentJson , expectJson ) ; return jsonCompare ; // System.out.println(obj2Str(jsonCompare)); public static Map test02 ( ) { System . out . println ( "==================测试多层json-Map==========================" ) ; Map < String , Object > exp = new HashMap < > ( ) ; Map < String , Object > exp01 = new HashMap < > ( ) ; exp01 . put ( "AA" , "-aa" ) ; exp01 . put ( "AB" , 22 ) ; exp01 . put ( "AC" , 33 ) ; // exp.put("", ""); exp . put ( "A" , "aa" ) ; exp . put ( "B" , exp01 ) ; exp . put ( "C" , exp01 ) ; Map < String , Object > curr = new HashMap < > ( ) ; Map < String , Object > curr01 = new HashMap < > ( ) ; curr01 . put ( "AB" , 22 ) ; curr01 . put ( "AC" , 22 ) ; // curr.put("", ""); curr . put ( "B" , curr01 ) ; curr . put ( "C" , new ArrayList < > ( ) ) ; String expectJson = obj2Str ( exp ) ; String currentJson = obj2Str ( curr ) ; Map jsonCompare = jsonCompare ( currentJson , expectJson ) ; return jsonCompare ; // System.out.println(obj2Str(jsonCompare)); public static Map test01 ( ) { System . out . println ( "==================测试单层json==========================" ) ; Map < String , Object > exp = new HashMap < > ( ) ; // exp.put("", ""); exp . put ( "A" , "aa" ) ; exp . put ( "B" , "ba" ) ; exp . put ( "C" , 2 ) ; exp . put ( "D" , null ) ; exp . put ( "E" , null ) ; exp . put ( "F" , 2 ) ; Map < String , Object > curr = new HashMap < > ( ) ; // curr.put("", ""); curr . put ( "B" , "bb" ) ; curr . put ( "C" , "2" ) ; curr . put ( "D" , "2" ) ; curr . put ( "E" , null ) ; curr . put ( "F" , null ) ; String expectJson = obj2Str ( exp ) ; String currentJson = obj2Str ( curr ) ; Map jsonCompare = jsonCompare ( currentJson , expectJson ) ; return jsonCompare ; // System.out.println(obj2Str(jsonCompare)); package com.cwq.demo02;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.ArrayList;import java.util.HashMap;import java.util.HashSet;import java.util.List;import java.util.Map;import java.util.Set;import c
&lt;转&gt;https://blog.csdn.net/lluozh2015/article/details/74910427 现在要 比较 两个 json 是否相等,若不同则返回差别 比如下面dict数据的对比: dict1 = {"id": "50356270565167104", "name": "班级优化"} dict2 = {"id": "503562705651671
json diff json diff是一个Go软件包,用于计算 两个 JSON 文档之间的 差异 (作为一系列 ( JSON Patch)操作),例如,它特别适合于创建Kubernetes Mutating Webhook的补丁响应。 首先,使用以下命令获取库的最新版本: $ go get github.com/wI2L/ json diff@latest :warning: 由于使用了软件包,因此需要Go1.14 +。 Kubernetes动态准入控制器 应用程序内的典型用例是 比较 表示 JSON 文档的源和所需目标的 两个 相同类型的值。 一个具体的应用是生成Kubernetes 返回的补丁以变异资源。 因此
介绍 两个 JAVA语言开源的 JSON 对比工具。 1,对于单元测试对比 JSON ,可使用文档中第一个工具集。 2,对于API响应 JSON 数据,需要对比时使用文档中第二个工具集,可以指定忽略噪声字段, 比较 强大。 不废话:https://github.com/kvnxiao/ json equals 使用至今,发现对 Json Array的顺序是必须判断的,需要自定义修改。