如何使用 json 在 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为空,它给了我这个错误:

接口转换:接口 {} 为零,而不是浮点数64

我真的很感谢任何评论!

这是尝试提取响应字段之前的所有代码:

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)
}

如果某些字段为零,则解决方案为指针!

如果使用绑定,则此代码就足够了

type Media struct {
MediaID   string `json:"media_id"`
MediaType float64    `json:"media_type"`
ViewCount *float64    `json:"view_count"`
}

但是如果你想在分配之前逐个字段地分配它(这不是一个好主意(,你应该检查媒体["view_count"]是否存在

var viewCount float64
tmpViewCount, ok := madia["view_count"]
if ok {
viewCount = tmpViewCount.(float64)
}
media := Media{
MediaID:   media["media_id"].(string),
MediaType: media["media_type"].(float64),
ViewCount: viewCount,
}

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)
}

最新更新