小故事:如何比较两个JSON块呢?下面的代码出错了。
var j, j2 interface{}
b := []byte(srv.req)
if err := json.Unmarshal(b, j); err !=nil{
t.Errorf("err %v, req %s", err, b)
return
}
d := json.NewDecoder(r.Body)
if err := d.Decode(j2); err !=nil{
t.Error(err)
return
}
if !reflect.DeepEqual(j2, j){
t.Errorf("j %v, j2 %v", j, j2)
return
}
长话来说:我正在做一些E2E测试,其中一部分需要比较请求的JSON主体和接收到的JSON。为此,我尝试将预期的和接收到的json解组为空接口(以避免任何类型错误),但我得到了一个错误:json: Unmarshal(nil)
.我猜encoding/json不喜欢空接口,所以问题是如何比较两个JSON块?字符串比较容易出错,所以我尽量避免。
4条答案
按热度按时间bxgwgixi1#
在这里参加派对太晚了。
golang中有一个流行的测试包,叫做require
github.com/stretchr/testify/require
,它可以帮你完成这项工作。官方文档:https://godoc.org/github.com/stretchr/testify/require#JSONEqf
gblwokeq2#
您需要传递指向
Decode
和Unmarshal
的指针。我用func JSONEqual(a, b io.Reader)
和JSONBytesEqual(a, b []byte)
创建了一个runnable sample,它们都返回(bool, error)
。您可以通过使用bytes.NewBuffer
或strings.NewReader
Package 预期内容来比较请求正文和静态预期内容(就像您在问题中尝试做的那样)。以下是代码:它输出:
bbmckpt73#
我写了一个工具来比较基于http json的响应,我忽略了顺序,你可以看看实现比较的包,并获取Equal函数:www.example.comhttps://github.com/emacampolo/gomparator/blob/master/json_util.go#L10
例如:
5rgfhyps4#
考虑使用https://pkg.go.dev/github.com/wI2L/jsondiff的包来帮助计算两个JSON文档之间的差异,作为一系列RFC6902(JSON Patch)操作。