我想解码
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/