【发布时间】:2015-12-01 06:02:27
【问题描述】:
短篇小说:如何比较两个 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 块?字符串比较容易出错,所以我试图避免这种情况。
【问题讨论】:
-
我认为您只需将声明更改为
j, j2 := map[string]interface{}{}, map[string]interface{}{}。不过,我知道您想要一个独立的示例,以便在 SO 上有一个好的答案。 :) -
不,我最初的评论是错误的;就是您需要将指针传递给
Decode/Unmarshal(尽管完整的示例仍然有帮助!)。