102 lines
2.5 KiB
Go
102 lines
2.5 KiB
Go
package main
|
||
|
||
import (
|
||
"encoding/json"
|
||
"fmt"
|
||
"reflect"
|
||
)
|
||
|
||
// CompareJSON 比较两个 JSON,返回新增、修改和删除的内容
|
||
func CompareJSON(json1, json2 string) (map[string]interface{}, map[string]interface{}, map[string]interface{}, error) {
|
||
var map1, map2 map[string]interface{}
|
||
|
||
// 解析 JSON
|
||
if err := json.Unmarshal([]byte(json1), &map1); err != nil {
|
||
return nil, nil, nil, fmt.Errorf("failed to parse json1: %v", err)
|
||
}
|
||
if err := json.Unmarshal([]byte(json2), &map2); err != nil {
|
||
return nil, nil, nil, fmt.Errorf("failed to parse json2: %v", err)
|
||
}
|
||
|
||
// 存储新增、修改和删除的内容
|
||
added := make(map[string]interface{})
|
||
modified := make(map[string]interface{})
|
||
deleted := make(map[string]interface{})
|
||
|
||
// 递归比较
|
||
compareMaps(map1, map2, added, modified, deleted, "")
|
||
|
||
return added, modified, deleted, nil
|
||
}
|
||
|
||
// compareMaps 递归比较两个 map
|
||
func compareMaps(map1, map2, added, modified, deleted map[string]interface{}, prefix string) {
|
||
// 遍历 map1,检查删除或修改
|
||
for key, val1 := range map1 {
|
||
fullKey := key
|
||
if prefix != "" {
|
||
fullKey = prefix + "." + key
|
||
}
|
||
|
||
val2, exists := map2[key]
|
||
if !exists {
|
||
// 如果 key 不存在于 map2,记录为删除
|
||
deleted[fullKey] = val1
|
||
} else if !reflect.DeepEqual(val1, val2) {
|
||
// 如果 key 存在但值不同,记录为修改
|
||
if reflect.TypeOf(val1) == reflect.TypeOf(val2) && reflect.TypeOf(val1).Kind() == reflect.Map {
|
||
// 如果值是嵌套对象,递归比较
|
||
compareMaps(val1.(map[string]interface{}), val2.(map[string]interface{}), added, modified, deleted, fullKey)
|
||
} else {
|
||
modified[fullKey] = map[string]interface{}{
|
||
"old": val1,
|
||
"new": val2,
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// 遍历 map2,检查新增
|
||
for key, val2 := range map2 {
|
||
fullKey := key
|
||
if prefix != "" {
|
||
fullKey = prefix + "." + key
|
||
}
|
||
|
||
if _, exists := map1[key]; !exists {
|
||
// 如果 key 不存在于 map1,记录为新增
|
||
added[fullKey] = val2
|
||
}
|
||
}
|
||
}
|
||
|
||
func main() {
|
||
json1 := `{
|
||
"name": "example",
|
||
"age": 25,
|
||
"address": {
|
||
"city": "New York",
|
||
"zip": "10001"
|
||
}
|
||
}`
|
||
|
||
json2 := `{
|
||
"name": "example",
|
||
"age": 26,
|
||
"address": {
|
||
"city": "Los Angeles"
|
||
},
|
||
"phone": "123-456-7890"
|
||
}`
|
||
|
||
added, modified, deleted, err := CompareJSON(json1, json2)
|
||
if err != nil {
|
||
fmt.Printf("Error: %v\n", err)
|
||
return
|
||
}
|
||
|
||
fmt.Printf("Added: %v\n", added)
|
||
fmt.Printf("Modified: %v\n", modified)
|
||
fmt.Printf("Deleted: %v\n", deleted)
|
||
}
|