Golang JSON差异比较库

最近在Golang项目里需要比较两个JSON结构的差异,请问有没有好用的第三方库推荐?最好能满足以下需求:

  1. 能准确识别字段值的差异
  2. 支持嵌套JSON结构的比较
  3. 能输出易于理解的差异报告
  4. 性能较好,适合处理较大的JSON数据

目前看到有go-cmp和deep-diff之类的库,不知道哪个更适合JSON比较场景?或者还有其他更好的选择吗?

2 回复

推荐使用 github.com/r3labs/diff 库。它支持比较两个结构体或 map 的差异,并生成 JSON Patch。简单易用,性能良好。

更多关于Golang JSON差异比较库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,推荐使用以下库来比较JSON数据的差异:

1. go-jsondiff

功能强大的JSON差异比较库,支持多种输出格式。

import "github.com/yudai/gojsondiff"

func main() {
    diff := gojsondiff.New()
    a := `{"name": "John", "age": 30}`
    b := `{"name": "John", "age": 31}`
    
    result, err := diff.Compare([]byte(a), []byte(b))
    if err != nil {
        panic(err)
    }
    
    if result.Modified() {
        fmt.Println("JSON有差异")
        // 获取详细差异
        formatter := gojsondiff.NewConsoleFormatter()
        output, _ := formatter.Format(result)
        fmt.Println(string(output))
    }
}

2. deep.Equal

虽然不是专门为JSON设计,但非常适合比较任意Go数据结构。

import "github.com/go-test/deep"

type Person struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

func main() {
    p1 := Person{Name: "John", Age: 30}
    p2 := Person{Name: "John", Age: 31}
    
    diff := deep.Equal(p1, p2)
    if diff != nil {
        fmt.Printf("差异: %v\n", diff)
    }
}

3. 标准库方案

对于简单场景,可以使用标准库:

import (
    "encoding/json"
    "reflect"
)

func CompareJSON(a, b []byte) (bool, error) {
    var obj1, obj2 interface{}
    
    if err := json.Unmarshal(a, &obj1); err != nil {
        return false, err
    }
    if err := json.Unmarshal(b, &obj2); err != nil {
        return false, err
    }
    
    return reflect.DeepEqual(obj1, obj2), nil
}

推荐选择

  • go-jsondiff: 需要详细差异信息时使用
  • deep.Equal: 比较结构化数据时使用
  • 标准库: 简单相等性检查时使用

这些库都能有效处理JSON数据的比较需求。

回到顶部