首页 > 解决方案 > JSON Unmarshal 预期响应和错误消息

问题描述

我正在向第 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
}

标签: jsongo

解决方案


您可以使用嵌入一次解码所有内容:

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


推荐阅读