第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何比較兩個 JSON 請求?

如何比較兩個 JSON 請求?

Go
阿晨1998 2021-11-08 10:06:40
短篇小說:如何比較兩個 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 進(jìn)行比較。為此,我嘗試將預(yù)期和收到的 json 解組到一個空接口(以避免任何類型錯誤),但我收到一個錯誤: json: Unmarshal(nil). 我猜 encoding/json 不喜歡空接口,所以問題是如何比較兩個 JSON 塊?字符串比較容易出錯,所以我試圖避免這種情況。
查看完整描述

3 回答

?
MMMHUHU

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個贊

這里的派對超級遲到。


golang 中有一個流行的測試包叫做 require github.com/stretchr/testify/require,它會為你做這件事。


func TestJsonEquality(t *testing.t) { 

  expected := `{"a": 1, "b": 2} `

  actual := ` {"b":   2, "a":   1}`

  require.JSONEq(t, expected, actual)

}

GoDocs:https ://godoc.org/github.com/stretchr/testify/require#JSONEqf


查看完整回答
反對 回復(fù) 2021-11-08
?
波斯汪

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超4個贊

您需要將指針傳遞給Decode和Unmarshal。我用和建立了一個可運(yùn)行的樣本,兩者都返回。您可以通過使用或包裝您的預(yù)期內(nèi)容來將請求正文與您的靜態(tài)預(yù)期內(nèi)容進(jìn)行比較(就像您在問題中嘗試做的那樣)。這是代碼:func JSONEqual(a, b io.Reader)JSONBytesEqual(a, b []byte)(bool, error)bytes.NewBufferstrings.NewReader


package main


import (

    "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.NewDecoder(a)

    if err := d.Decode(&j); err != nil {

        return false, err

    }

    d = json.NewDecoder(b)

    if err := d.Decode(&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=b\t", eq, "with error", err)

    eq, err = JSONBytesEqual(a, c)

    fmt.Println("a=c\t", eq, "with error", err)

    eq, err = JSONBytesEqual(a, empty)

    fmt.Println("a=empty\t", eq, "with error", err)

    eq, err = JSONBytesEqual(a, bad)

    fmt.Println("a=bad\t", eq, "with error", err)

}

它輸出:


a=b  true with error <nil>

a=c  false with error <nil>

a=empty  false with error EOF

a=bad    false with error invalid character 't' looking for beginning of object key string



查看完整回答
反對 回復(fù) 2021-11-08
?
泛舟湖上清波郎朗

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超3個贊

我寫了一個工具來比較基于 http json 的響應(yīng),但我忽略了順序。可以看一下實(shí)現(xiàn)比較和抓取Equal函數(shù)的包:https : //github.com/emacampolo/gomparator/blob/master/json_util.go#L10


例如:


b1 := []byte(`{"x": {"t": 1, "s": 2}, "z": 1}`)

b2 := []byte(`{"z": 1, "x": {"s": 2, "t": 1}}`)


j1, _ := Unmarshal(b1)

j2, _ := Unmarshal(b2)

assert.True(t, Equal(j1, j2))


查看完整回答
反對 回復(fù) 2021-11-08
  • 3 回答
  • 0 關(guān)注
  • 269 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號