我想解码

var j = []byte(`[{"major":1},{"minor":0}]`)
进入
type Version struct {
    Major int `json:"major"`
    Minor int `json:"minor"`
}
通过循环内部 slice 使用自定义拆组器:
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)输出将是(在Go Playground上尝试):
<nil>
{1 0}
通常,这会导致堆栈溢出错误,但是由于您的第二次调用错误,递归会中断。参见相关:Call json.Unmarshal inside UnmarshalJSON function without causing stack overflow

关于json - 如何修复json : cannot unmarshal object into Go value of type []json. RawMessage,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/66238481/

10-11 16:45