如何修复 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}
通常这会导致堆栈溢出错误,但由于您的第二次调用错误,递归中断。见相关:
我要解组
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}
通常这会导致堆栈溢出错误,但由于您的第二次调用错误,递归中断。见相关: