json - 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
}
解决方案
您可以使用嵌入一次解码所有内容:
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
推荐阅读
- sql - 为什么必须在一个 sql server conn 上选择“信任服务器证书”以及“加密连接”,而在另一个上只选择“加密连接”?
- go - 多根设置
- java - 我想打印给定范围之间的所有 Armstrong 编号,而不管编号如何。用户在 Java 中输入的数字中的位数
- c++ - 如何找出类实例模板的类型?
- aws-cdk - 错误处理程序未捕获 Aws 阶跃函数超时
- laravel - Laravel Vapor 自定义日志以 JSON 格式记录到 Amazon AWS Cloudwatch
- apache-kafka - Apache Kafka ksqlDB 不会随着时间的变化而发出
- leaflet - 移动设备上的传单 - 带有 layer.setIcon 的 json 标记消失在地图外
- visual-studio - 如果打包 UWP,Visual Studio 总是重建解决方案
- ios - 颤动的ios动态链接总是打开appstore,我已将关联域正确设置为applinks:XXXX.XXX,