为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
哆啦的时光机 2022-08-09 20:15:42
我想解除元帅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 不会引起堆栈溢出


查看完整回答
反对 回复 2022-08-09
  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信