当前位置: > > > > 解析 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 种不同类型》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注公众号!