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) }