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