解码不同JSON映射中的结构

时间:2016-01-26 14:04:41

标签: json go

我正在尝试使用相同的属性解码两个不同的响应,唯一的区别是它们来自的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 个答案:

答案 0 :(得分:3)

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

但是如果你确实希望将所有内容解组为一个结构,那么执行此操作的一种方法是将结构解组为具有所有可能别名的字段的结构,然后分配非空的结构。 E.g:

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

答案 1 :(得分:0)

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

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