[英]Cannot convert expression of type *json.RawMessage to type []byte in golang
[英]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)
output 將是(在Go Playground上嘗試):
<nil>
{1 0}
通常這會導致堆棧溢出錯誤,但由於您的第二次調用錯誤,遞歸中斷。 相關見: Call json.Unmarshal inside UnmarshalJSON function 而不會導致堆棧溢出
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.