这是我的结构:
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)
}