我想解除元帅var j = []byte(`[{"major":1},{"minor":0}]`)到type Version struct { Major int `json:"major"` Minor int `json:"minor"`}通过循环内部切片来使用自定义取消marshaler: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}内部触发器UnmarshalJSONjson: cannot unmarshal object into Go value of type []json.RawMessage这很奇怪,因为目标是.这是怎么回事?玩: https://play.golang.org/p/Av59IkYTioS*Version
1 回答
跃然一笑
TA贡献1826条经验 获得超6个赞
“内部”非元帅呼叫将递归调用: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
}
}
通过此更改,它可以工作,并且添加输出将是(在Go Playground上尝试):fmt.Println(msg)
<nil>
{1 0}
通常,这会导致堆栈溢出错误,但由于第二次调用错误,递归会中断。请参阅相关:调用 json。UnmarshalJSON 函数中的 Unmarshal 不会引起堆栈溢出
- 1 回答
- 0 关注
- 121 浏览
添加回答
举报
0/150
提交
取消