compare-json(Go)

compare-json-go 是 compare-json 的 Go 移植版——结构化 JSON 对比,语义与本网站使用的对比引擎完全一致。它可以检测两个 JSON 值之间的新增、删除、类型变更和值变更,并支持控制键、值和数组的匹配方式。同时提供库与 CLI,零外部依赖。

语言:Go —— 通过 pkg.go.dev 分发。源码见 GitHub。

安装

go get github.com/unitstack/compare-json-go

快速开始

库

package main

import (
	"encoding/json"
	"fmt"

	comparejson "github.com/unitstack/compare-json-go"
)

func main() {
	var base, contrast interface{}
	json.Unmarshal([]byte(`{"name":"Alice","age":30}`), &base)
	json.Unmarshal([]byte(`{"name":"Bob","age":"30","email":"[email protected]"}`), &contrast)

	diffs := comparejson.CompareJSON(base, contrast, &comparejson.CompareOptions{
		ArrayCompareMethod: comparejson.ArrayCompareByIndex, // 或 ArrayCompareLCS、ArrayCompareUnordered
	})
	for _, d := range diffs {
		fmt.Println(d.PathString, d.PathBelongsTo, d.DiffType)
	}
	// name   both     valueChanged
	// age    both     typeChanged
	// email  contrast added
}

CLI

# 对比 JSON 文件
compare-json base.json contrast.json

# 数组策略与大小写不敏感匹配
compare-json -a lcs -k -v base.json contrast.json

# 输出机器可读的 JSON
compare-json --json-export base.json contrast.json

# 将报告写入文件
compare-json -o diff.txt base.json contrast.json

注意:由于使用标准库 flag 包,标志必须放在位置参数之前。

选项

标志说明
-a, --array-compare-method数组对比策略:byIndex(默认)、lcs、unordered
-k, --key-case-insensitive键名大小写不敏感对比
-v, --value-case-insensitive字符串值大小写不敏感对比
--numeric-string-equals-number将数字字符串视为与数字相等
-j, --json-export以 JSON 格式输出差异
-o, --output <file>将输出写入文件而非标准输出

各选项的详细说明请参阅对比选项和数组对比方法。

许可证

MIT