我正在尝试使用相同的属性解码两个不同的响应,唯一的区别是它们来自的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"`
}
答案 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
}
答案 1 :(得分:0)
您可以通过在另一个结构中嵌入ResponseProperties指针并在这些结构中实现json.Unmarshaller接口来覆盖unmarshal行为。请注意结构中指针的危险,因为指针默认为nil。
这是一个游乐场示例:http://play.golang.org/p/ZTlLp0_wGY