您需要将指针传递给
Depre和
Unmarshal。我用和放了一个可运行的示例,都返回。您可以使用或封装您的期望内容,从而将请求正文与您的静态期望内容进行比较(就像您要在问题中尝试做的那样)。这是代码:
funcJSonEqual(a, b io.Reader)``JSonBytesEqual(a, b []byte)``(bool,error)``bytes.NewBuffer``strings.NewReader
package mainimport ( "encoding/json" "fmt" "io" "reflect")// JSonEqual compares the JSON from two Readers.func JSonEqual(a, b io.Reader) (bool, error) { var j, j2 interface{} d := json.NewDeprer(a) if err := d.Depre(&j); err != nil { return false, err } d = json.NewDeprer(b) if err := d.Depre(&j2); err != nil { return false, err } return reflect.DeepEqual(j2, j), nil}// JSonBytesEqual compares the JSON in two byte slices.func JSonBytesEqual(a, b []byte) (bool, error) { var j, j2 interface{} if err := json.Unmarshal(a, &j); err != nil { return false, err } if err := json.Unmarshal(b, &j2); err != nil { return false, err } return reflect.DeepEqual(j2, j), nil}func main() { a := []byte(`{"x": ["y",42]}`) b := []byte(`{"x": ["y", 42]}`) c := []byte(`{"z": ["y", "42"]}`) empty := []byte{} bad := []byte(`{this? this is a test.}`) eq, err := JSonBytesEqual(a, b) fmt.Println("a=bt", eq, "with error", err) eq, err = JSonBytesEqual(a, c) fmt.Println("a=ct", eq, "with error", err) eq, err = JSonBytesEqual(a, empty) fmt.Println("a=emptyt", eq, "with error", err) eq, err = JSonBytesEqual(a, bad) fmt.Println("a=badt", eq, "with error", err)}它输出:
a=b true with error <nil>a=c false with error <nil>a=empty false with error EOFa=bad false with error invalid character 't' looking for beginning of object key string



