Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
amos-boot-biz
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
项目统一框架
amos-boot-biz
Commits
ee09c937
Commit
ee09c937
authored
May 29, 2025
by
suhuiguang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix(大编辑):bug修复
1.json字段比较优化,null比较处理
parent
a866893b
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
53 additions
and
20 deletions
+53
-20
JsonDiffUtil.java
...join/amos/boot/module/jg/biz/edit/utils/JsonDiffUtil.java
+53
-20
No files found.
amos-boot-system-tzs/amos-boot-module-jg/amos-boot-module-jg-biz/src/main/java/com/yeejoin/amos/boot/module/jg/biz/edit/utils/JsonDiffUtil.java
View file @
ee09c937
...
@@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
...
@@ -4,8 +4,8 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.JsonNode
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
java.math.BigDecimal
;
import
java.util.Iterator
;
import
java.util.Iterator
;
import
java.util.Map
;
public
class
JsonDiffUtil
{
public
class
JsonDiffUtil
{
...
@@ -25,31 +25,61 @@ public class JsonDiffUtil {
...
@@ -25,31 +25,61 @@ public class JsonDiffUtil {
}
}
private
static
boolean
equalsIgnoreType
(
JsonNode
node1
,
JsonNode
node2
)
{
private
static
boolean
equalsIgnoreType
(
JsonNode
node1
,
JsonNode
node2
)
{
// 处理输入的 null JsonNode
// === 第1阶段:处理null值 ===
// 情况1a:两个都是Java null(对象不存在)
if
(
node1
==
null
&&
node2
==
null
)
return
true
;
if
(
node1
==
null
&&
node2
==
null
)
return
true
;
if
(
node1
==
null
||
node2
==
null
)
return
node1
==
node2
;
//
处理 JSON null
节点
//
情况1b:一个是Java null,另一个是JSON Null
节点
if
(
node1
.
isNull
()
&&
node2
.
isNull
())
return
true
;
if
(
node1
==
null
)
return
node2
.
isNull
()
;
if
(
node
1
.
isNull
()
||
node2
.
isNull
())
return
false
;
if
(
node
2
==
null
)
return
node1
.
isNull
()
;
// 节点类型不同时尝试转换为文本比较
// === 第2阶段:处理JSON Null节点 ===
// 现在确定两个node都不为null(Java对象层面)
if
(
node1
.
isNull
()
||
node2
.
isNull
())
{
// 只有两个都是JSON Null才相等
return
node1
.
isNull
()
&&
node2
.
isNull
();
}
// === 第3阶段:类型不同时的转换比较 ===
if
(!
node1
.
getNodeType
().
equals
(
node2
.
getNodeType
()))
{
if
(!
node1
.
getNodeType
().
equals
(
node2
.
getNodeType
()))
{
return
node1
.
asText
().
equals
(
node2
.
asText
());
// 情况3a:数字与字符串数字比较(如 42 和 "42")
if
(
node1
.
isNumber
()
&&
node2
.
isTextual
())
{
try
{
return
node1
.
decimalValue
().
compareTo
(
new
BigDecimal
(
node2
.
asText
()))
==
0
;
}
catch
(
NumberFormatException
e
)
{
return
false
;
}
}
if
(
node2
.
isNumber
()
&&
node1
.
isTextual
())
{
try
{
return
node2
.
decimalValue
().
compareTo
(
new
BigDecimal
(
node1
.
asText
()))
==
0
;
}
catch
(
NumberFormatException
e
)
{
return
false
;
}
}
// 情况3b:布尔与字符串布尔比较(如 true 和 "true")
if
(
node1
.
isBoolean
()
&&
node2
.
isTextual
())
{
return
node1
.
asBoolean
()
==
Boolean
.
parseBoolean
(
node2
.
asText
());
}
if
(
node2
.
isBoolean
()
&&
node1
.
isTextual
())
{
return
node2
.
asBoolean
()
==
Boolean
.
parseBoolean
(
node1
.
asText
());
}
// 其他类型不匹配情况
return
false
;
}
}
// 根据不同类型处理
// === 第4阶段:相同类型详细比较 ===
switch
(
node1
.
getNodeType
())
{
switch
(
node1
.
getNodeType
())
{
case
OBJECT:
case
OBJECT:
if
(
node1
.
size
()
!=
node2
.
size
())
return
false
;
if
(
node1
.
size
()
!=
node2
.
size
())
return
false
;
Iterator
<
String
>
fieldNames
=
node1
.
fieldNames
();
Iterator
<
Map
.
Entry
<
String
,
JsonNode
>>
fields
=
node1
.
fields
();
while
(
fieldNames
.
hasNext
())
{
while
(
fields
.
hasNext
())
{
String
fieldName
=
fieldNames
.
next
();
Map
.
Entry
<
String
,
JsonNode
>
entry
=
fields
.
next
();
JsonNode
value2
=
node2
.
get
(
fieldName
);
JsonNode
value2
=
node2
.
get
(
entry
.
getKey
());
if
(
value2
==
null
)
return
false
;
// key不存在
if
(
value2
==
null
&&
!
node2
.
has
(
entry
.
getKey
()))
{
if
(!
equalsIgnoreType
(
node1
.
get
(
fieldName
),
value2
))
{
return
false
;
// 键不存在
}
if
(!
equalsIgnoreType
(
entry
.
getValue
(),
value2
))
{
return
false
;
return
false
;
}
}
}
}
...
@@ -65,19 +95,22 @@ public class JsonDiffUtil {
...
@@ -65,19 +95,22 @@ public class JsonDiffUtil {
return
true
;
return
true
;
case
STRING:
case
STRING:
// 字符串严格比较(区分大小写)
return
node1
.
asText
().
equals
(
node2
.
asText
());
return
node1
.
asText
().
equals
(
node2
.
asText
());
case
NUMBER:
case
NUMBER:
// 精确数字比较(避免浮点误差)
return
node1
.
decimalValue
().
compareTo
(
node2
.
decimalValue
())
==
0
;
return
node1
.
decimalValue
().
compareTo
(
node2
.
decimalValue
())
==
0
;
case
BOOLEAN:
case
BOOLEAN:
return
node1
.
asBoolean
()
==
node2
.
asBoolean
();
return
node1
.
asBoolean
()
==
node2
.
asBoolean
();
case
NULL:
case
NULL:
return
true
;
// 前面已经处理过null
// 理论上不会执行到这里,因为前面已经处理过null
return
true
;
default
:
default
:
return
false
;
return
false
;
// 未知类型不相等
}
}
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment