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

解码不同 JSON 映射中的结构

解码不同 JSON 映射中的结构

Go
慕尼黑的夜晚无繁华 2021-12-07 16:09:39
我试图用相同的属性解码两个不同的响应,唯一的区别是它们来自的 JSON 映射的名称。实现以下演示的正确方法是什么?type ResponseProperties struct {    CurrentPage uint    TotalPages  uint    Events      []TrackingEvent}type TrackingResponse struct {    //  ResponseProperties    CurrentPage uint            `json:"current_page"`    TotalPages  uint            `json:"total_pages"`    Events      []TrackingEvent `json:"clicks"`}type SubscriberResponse struct {    //  ResponseProperties    CurrentPage uint            `json:"current_page"`    TotalPages  uint            `json:"total_pages"`    Events      []TrackingEvent `json:"subscribers"`}
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

我建议只是将它们分开。您永远不知道 API 响应何时突然发生变化。


但是,如果您确实想将所有内容解组到一个结构中,一种方法是解组到一个具有所有可能别名字段的结构中,然后分配一个非空的字段。例如:


type Basket struct {

    NumFruit int

    Fruits   []string // Can be either "Apples" or "Oranges" in JSON.

}


func (bskt *Basket) UnmarshalJSON(b []byte) error {

    type Basket_ Basket

    v := struct {

        Basket_

        Apples, Oranges []string

    }{}

    if err := json.Unmarshal(b, &v); err != nil {

        return err

    }

    *bskt = Basket(v.Basket_)

    if v.Apples != nil {

        bskt.Fruits = v.Apples

    }

    if v.Oranges != nil {

        bskt.Fruits = v.Oranges

    }

    return nil

}

游乐场:http : //play.golang.org/p/pLe5EwsYEP。


查看完整回答
反对 回复 2021-12-07
?
烙印99

TA贡献1829条经验 获得超13个赞

您可以通过在另一个结构中嵌入 ResponseProperties 指针并在这些结构中实现 json.Unmarshaller 接口来覆盖解组行为。请注意结构内部指针的危险,因为指针将默认为 nil。

这是一个游乐场示例:http : //play.golang.org/p/ZTlLp0_wGY


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

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