Go 中重写 UnmarshalJSON 后取不到值的原因与解决办法是什么?

go 中重写 unmarshaljson 后取不到值的原因与解决办法是什么?

重写 unmarshaljson 后取不到值的原因与解决办法

在 go 中,嵌套的结构体的接口会被外层结构体继承。故在代码中,对 idarr 结构体重写 unmarshaljson 方法后,a 结构体也继承了该方法。

问题在于重写的 unmarshaljson 方法只处理了 idarr 结构体,导致 more 字段无法解析。

解决办法有以下几种:

  1. 最小粒度重写方法: 只重写 idarr 结构体中需要处理的部分,保持 unmarshaljson 方法的最小粒度。
  2. 重写 a 的 unmarshaljson 方法: 直接在 a 结构体中重写 unmarshaljson 方法,处理 ids 和 more 字段。
func (s *a) unmarshaljson(data []byte) error {
    t := struct {
        ids []string `json:"ids"`
        more string `json:"more"`
    }{}

    if err := json.unmarshal(data, &t); err != nil {
        return err
    }
    for _, id := range t.ids {
        uid, err := strconv.parseint(id, 10, 64)
        if err != nil {
            return err
        }
        s.ids = append(s.ids, uint64(uid))
    }
    s.more = t.more
    return nil
}
  1. 修改结构体定义: 去除匿名嵌套,将 idarr 和 a 作为一个独立的结构体。这样就不会出现继承问题。
type B struct {
    Ids []uint64
}

type A struct {
    B
    More string `json:"more"`
}

以上就是Go 中重写 UnmarshalJSON 后取不到值的原因与解决办法是什么?的详细内容,更多请关注其它相关文章!