首页 > 解决方案 > 如何使用 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)
}

标签: jsonapigo

解决方案


中的数字字段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)
}

推荐阅读