簡體   English   中英

如何修復 json:無法將 object 解組為 []json.RawMessage 類型的 Go 值

[英]How to fix json: cannot unmarshal object into Go value of type []json.RawMessage

我想解組

var j = []byte(`[{"major":1},{"minor":0}]`)

進入

type Version struct {
    Major int `json:"major"`
    Minor int `json:"minor"`
}

通過循環內部切片使用自定義解組器:

func (h *Version) UnmarshalJSON(b []byte) error {
    var wrapper []json.RawMessage

    err := json.Unmarshal(b, &wrapper)
    if err == nil {
        for _, v := range wrapper {
            if err = json.Unmarshal(v, &h); err != nil {
                break
            }
        }
    }

    return err
}

內部UnmarshalJSON觸發器

json: cannot unmarshal object into Go value of type []json.RawMessage

這很奇怪,因為目標是*Version 這里有什么問題? 播放: https://play.golang.org/p/Av59IkYTioS

“內部”解組調用將遞歸調用Version.UnmarshalJSON()

json.Unmarshal(v, &h)

您的錯誤來自遞歸調用:您嘗試將{"major":1}解組為[]json.RawMessage

您不想遞歸調用Version.UnmarshalJSON() ,因此創建一個新類型來剝離所有方法,包括UnmarshalJSON()

    type version Version
    h2 := (*version)(h)
    for _, v := range wrapper {
        if err = json.Unmarshal(v, &h2); err != nil {
            break
        }
    }

通過此更改,它可以工作,並添加fmt.Println(msg) output 將是(在Go Playground上嘗試):

<nil>
{1 0}

通常這會導致堆棧溢出錯誤,但由於您的第二次調用錯誤,遞歸中斷。 相關見: Call json.Unmarshal inside UnmarshalJSON function 而不會導致堆棧溢出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM