JSON Unmarshal 预期响应和错误消息

标签 json go

我正在向第 3 方 API 发出 JSON 请求。如果我的身份验证 token 已过期,我会收到 {"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 Unmarshal 预期响应和错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61658666/

相关文章:

c# - 使用 Unity 的 SimpleJSON 检索不带引号的字符串

go - 将 Go 源代码和覆盖率导入 SonarQube

http - 使用自定义动词Golang解析请求正文

C# 将 JSON 写入不带反斜杠的文件

json - 将JSON(从Oracle TIMESTAMP)加载到Dart DateTime

json - 如何使用Play with Scala加载JSON文件

json - 尝试将 unix 格式的字符串转换为 time.Time 时,使用 json.Unmarshal 给出 ParseError

go - 如何为golang实现32字节 key 的TripleDES DESede/ECB/PKCS5Padding加密?

go - 接口(interface)函数/"cast"在golang中实际上做了什么?

java - 如何在 Spring Boot 中以 JSON 形式抛出异常