登录
首页 >  Golang >  Go问答

解析 JSON 数据的期望输出和错误信息

来源:stackoverflow

时间:2024-03-05 09:15:28 316浏览 收藏

大家好,我们又见面了啊~本文《解析 JSON 数据的期望输出和错误信息》的内容中将会涉及到等等。如果你正在学习Golang相关知识,欢迎关注我,以后会给大家带来更多Golang相关文章,希望我们能一起进步!下面就开始本文的正式内容~

问题内容

我正在向第 3 方 api 发出 json 请求。如果我的身份验证令牌已过期,我会收到 {"error": "message"}。如果一切正常,我会收到有效的回复。

现在,我调用 json.unmarshal 两次来解析响应:一次用于检查错误,一次用于解析真实数据。

有什么方法可以避免调用 unmarshal 两次吗?

type Unknown map[string]interface{}
type Response struct {
    Status   string `json:"status"`
    Strategy string `json:"strategy"`
    Items    []Item `json:"items"`
}
unknown := Unknown{}
json.Unmarshal(jsonData, &unknown)

if val, ok := unknown["error"]; ok {
    fmt.Println(val)
    return
}

response := Response{}
err := json.Unmarshal(jsonData, &response)
if err != nil {
    fmt.Println("There was an error")
    fmt.Println(err)
    return
}

解决方案


您可以使用 embedding 一次性解码所有内容:

type Response struct {
    Status   string `json:"status"`
    Strategy string `json:"strategy"`
    Items    []Item `json:"items"`
}

var dest struct {
    Error string `json:"error"`
    Response // embedded Response
}
if err := json.Unmarshal(jsonData, &dest); err != nil {
    fmt.Println(err)
    return
} else if len(dest.Error) > 0 {
    fmt.Println(dest.Error)
    return
}

response := dest.Response
// ...

参见演示示例:https://play.golang.com/p/eAhFt99n07k

好了,本文到此结束,带大家了解了《解析 JSON 数据的期望输出和错误信息》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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