登录
首页 >  Golang >  Go问答

解析 JSON 时如何容纳同一字段的 2 种不同类型

来源:stackoverflow

时间:2024-04-21 15:15:35 282浏览 收藏

哈喽!今天心血来潮给大家带来了《解析 JSON 时如何容纳同一字段的 2 种不同类型》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我正在使用一个 json rest api,它可以返回同一字段的 2 种不同类型。

以下是来自 api 的响应示例:

257188​​285623

但有时它也会返回这个

"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

我该如何处理这种情况?


正确答案


您可以实现 json.Unmarshaler 接口来自定义错误字段的解码方式。

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"`
}

https://go.dev/play/p/U7FBiA9qB54

今天关于《解析 JSON 时如何容纳同一字段的 2 种不同类型》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>