当前位置: > > > > 解析 JSON 时如何容纳同一字段的 2 种不同类型
解析 JSON 时如何容纳同一字段的 2 种不同类型
来源:stackoverflow
2024-04-21 15:15:35
0浏览
收藏
哈喽!今天心血来潮给大家带来了《解析 JSON 时如何容纳同一字段的 2 种不同类型》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!
问题内容
我正在使用一个 json rest api,它可以返回同一字段的 2 种不同类型。
以下是来自 api 的响应示例:
257188285623
但有时它也会返回这个
"result": {
"value": {
"error": {
"msg": "rate limit exceeded"
},
"logs": []
}
},
如您所见,error 字段可以更改为对象。
这是我在代码中定义类型的方式
type ApiResponse struct {
Result struct {
Value struct {
Error string `json:"error"`
Logs []string `json:"logs"`
} `json:"value"`
} `json:"result"`
}
但是由于错误类型可能会发生变化,因此有时在 json 解组时会出现问题: json: 无法将对象解组到 go struct field .result.value.error of type string
我该如何处理这种情况?
正确答案
您可以实现 接口来自定义错误字段的解码方式。
type errormessage struct {
text string
}
func (e *errormessage) unmarshaljson(data []byte) error {
if len(data) == 0 || string(data) == "null" {
return nil
}
if data[0] == '"' && data[len(data)-1] == '"' { // string?
return json.unmarshal(data, &e.text)
}
if data[0] == '{' && data[len(data)-1] == '}' { // object?
type t struct {
text string `json:"msg"`
}
return json.unmarshal(data, (*t)(e))
}
return fmt.errorf("unsupported error message type")
}
然后将 apiresponse 类型的 error 字段更新为 errormessage 类型。
type ApiResponse struct {
Result struct {
Value struct {
Error ErrorMessage `json:"error"`
Logs []string `json:"logs"`
} `json:"value"`
} `json:"result"`
}
今天关于《解析 JSON 时如何容纳同一字段的 2 种不同类型》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注米云公众号!
