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
)
;
if
(
currObj
==
null
)
{
Object expObj
=
exp
.
get
(
currKey
)
;
if
(
expObj
!=
null
)
{
result
.
put
(
keyStrCopy
,
String
.
format
(
"key=[%s]期望为[%s],但当前为[%s]"
,
keyStrCopy
,
expObj
,
currObj
)
)
;
continue
;
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
;
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
)
;
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
.
forEach
(
(
key
,
value
)
-
>
{
if
(
)
{
}
)
;
public
static
void
main
(
String
[
]
args
)
{
Map
<
String
,
Object
>
result
=
new
HashMap
<
>
(
)
;
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
(
"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
(
"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
;
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
(
"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
(
"B"
,
curr01
)
;
curr
.
put
(
"C"
,
new
ArrayList
<
>
(
)
)
;
String expectJson
=
obj2Str
(
exp
)
;
String currentJson
=
obj2Str
(
curr
)
;
Map jsonCompare
=
jsonCompare
(
currentJson
,
expectJson
)
;
return
jsonCompare
;
public
static
Map
test01
(
)
{
System
.
out
.
println
(
"==================测试单层json=========================="
)
;
Map
<
String
,
Object
>
exp
=
new
HashMap
<
>
(
)
;
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
(
"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
;
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
<转>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的顺序是必须判断的,需要自定义修改。