json - 如何使用 json.NewDecoder 在 Go 中处理 json 响应中的空值
问题描述
这是我的结构:
type Media struct {
MediaID string `json:"media_id"`
MediaType float64 `json:"media_type"`
ViewCount float64 `json:"view_count"`
}
我正在编写一个 API 来提供一些媒体文件,并且我正在使用 json.NewDecoder 来解码和处理响应。我这样填充我的结构:
media := Media{
MediaID: media["media_id"].(string),
MediaType: media["media_type"].(float64),
ViewCount: media["view_count"].(float64),
}
它在许多情况下都可以正常工作,但问题是有时view_count为空,它给了我这个错误:
接口转换:interface {} 为 nil,不是 float64
我真的很感激任何评论!
这是尝试提取响应字段之前的所有代码:
var (
r map[string]interface{}
)
var buf bytes.Buffer
query := map[string]interface{}{
"query": map[string]interface{}{
"match": map[string]interface{}{
"content": params["q"],
},
},
}
if err := json.NewEncoder(&buf).Encode(query); err != nil {
log.Fatalf("Error encoding query: %s", err)
}
res, err = es.Search(
es.Search.WithContext(context.Background()),
es.Search.WithIndex("myindex"),
es.Search.WithBody(&buf),
es.Search.WithTrackTotalHits(true),
es.Search.WithPretty(),
)
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
log.Fatalf("Error parsing the response body: %s", err)
}
解决方案
中的数字字段Media
可能应该是整数值而不是浮点值:
type Media struct {
MediaID string `json:"media_id"`
MediaType int `json:"media_type"`
ViewCount int `json:"view_count"`
}
如果 JSON 文档null
用于这些值,则在数字字段中使用指针。希望不是这种情况,因为应用程序必须编写一些额外的代码来尊重指针。
type Media struct {
MediaID string `json:"media_id"`
MediaType *int `json:"media_type"`
ViewCount *int `json:"view_count"`
}
Media
无论哪种方式,按照问题评论中的建议直接解码 :
var media Media
if err := json.NewDecoder(res.Body).Decode(&media); err != nil {
log.Fatalf("Error parsing the response body: %s", err)
}
推荐阅读
- javascript - 从 Render 中的循环中获取变量到 ReactJS 中的 componentDidMount() 并将此变量放入查询参数中
- python - 使用预建模板创建 python 注册
- mysql - Laravel MySql Connection 连接太多的问题
- javascript - 编辑图例标签 [vue-chart.js]
- objective-c - 类“IGListSectionController”的重复接口定义
- html - 制作一面旗帜和百分比
- html - 如何获取边框属性以填充具有 n 填充的 div 的 100% 宽度
- cdi - 动态获取从一个 bean 到另一个 bean 的引用
- awk - 带有 IP 和端口的 GREP 和 AWK 文件
- git - 错误:RPC 失败;curl 92 HTTP/2 流 0 未完全关闭:PROTOCOL_ERROR (err 1)