我正在尝试解码两个具有相同属性的不同响应,唯一的区别是它们来自 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"`
}
最佳答案
我建议将它们分开。您永远不知道 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
}
Playground :http://play.golang.org/p/pLe5EwsYEP .
关于json - 解码不同 JSON 映射中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35015666/