如何修复 json:无法将元帅对象解构为类型为 []json 类型的 Go 值。原始消息

我想解除元帅


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

}

内部触发器UnmarshalJSON


json: cannot unmarshal object into Go value of type []json.RawMessage

这很奇怪,因为目标是.这是怎么回事?玩: https://play.golang.org/p/Av59IkYTioS*Version


哆啦的时光机
浏览 122回答 1
1回答

跃然一笑

“内部”非元帅呼叫将递归调用:Version.UnmarshalJSON()json.Unmarshal(v, &h)你的错误来自递归调用:你试图将元帅解绑到.{"major":1}[]json.RawMessage您不希望以递归方式调用,因此请创建一个剥离所有方法的新类型,包括:Version.UnmarshalJSON()UnmarshalJSON()&nbsp; &nbsp; type version Version&nbsp; &nbsp; h2 := (*version)(h)&nbsp; &nbsp; for _, v := range wrapper {&nbsp; &nbsp; &nbsp; &nbsp; if err = json.Unmarshal(v, &h2); err != nil {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }通过此更改,它可以工作,并且添加输出将是(在Go Playground上尝试):fmt.Println(msg)<nil>{1 0}通常,这会导致堆栈溢出错误,但由于第二次调用错误,递归会中断。请参阅相关:调用 json。UnmarshalJSON 函数中的 Unmarshal 不会引起堆栈溢出
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go