我有以下响应结构,我想用它作为基本包装器来响应用户发送给我的API调用。
type Response struct {
Data ??? `json:"data,omitempty"`
Time int64 `json:"time,omitempty"`
Message string `json:"message,omitempty"`
}
数据字段的类型各不相同,可能是map[string]*CustomStruct1
map[string*CustomStruct2
或[]CustomStruct3
。
攻击此类问题的最佳方法是什么?
答案 0 :(得分:1)
一种选择是简单地将“数据”视为interface{}
(任意)类型,而不是使用自定义结构,并根据对实际取消编组的内容的检查来处理结果值。当然,一旦你检查了数据以确定它应该是什么类型,你可以在事后将其转换为适当的强类型。
type Response struct {
Data interface{} `json:"data,omitempty"`
Time int64 `json:"time,omitempty"`
Message string `json:"message,omitempty"`
}
另一种选择是将“Response”结构嵌入到专门的结构中,这些结构会查找您的自定义类型并解组为适当的类型,假设您知道您提前获得了哪一个:
type BaseResponse struct {
Time int64 `json:"time,omitempty"`
Message string `json:"message,omitempty"`
}
type Response1 struct {
BaseResponse
Data map[string]*CustomStruct1 `json:"data"`
}
type Response2 struct {
BaseResponse
Data map[string]*CustomStruct2 `json:"data"`
}
// etc...
最终,unmarshaler无法根据取消编组的文档选择变量类型,它只会将JSON值反序列化为由您明确定义的结构或通用定义的结构。
答案 1 :(得分:0)
你可以尝试使用反射,但它不会非常惯用。