如何修复 json:无法将对象解组为 []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) 输出将是(在 Go Playground 上尝试):

<nil>
{1 0}

通常这会导致堆栈溢出错误,但由于您的第二次调用错误,递归中断。见相关: