我正在尝试将map[string]interface{}
解码为结构,但是“ hours”字段未填充。我正在使用https://github.com/mitchellh/mapstructure进行解码。这是结构:
BusinessAddRequest struct {
Name string `json:"name"`
Phone string `json:"phone"`
Website string `json:"website,omitempty"`
Street string `json:"street"`
City string `json:"city"`
PostalCode string `json:"postalCode"`
State string `json:"state"`
Hours []struct {
Day string `json:"day"`
OpenTimeSessionOne string `json:"open_time_session_one,omitempty"`
CloseTimeSessionOne string `json:"close_time_session_one,omitempty"`
OpenTimeSessionTwo string `json:"open_time_session_two,omitempty"`
CloseTimeSessionTwo string `json:"close_time_session_two,omitempty"`
} `json:"hours"`
Cuisine []string `json:"cuisine,omitempty"`
BusinessID int `json:"businessId,omitempty"`
AddressID int `json:"addressId,omitempty"`
UserID int `json:"userId,omitempty"`
}
这是示例数据:
{
"name": "Agave ...",
"phone": "(408) 000-000",
"street": "Abcd",
"city": "San",
"postalCode": "90000",
"state": "CA",
"hours": [
{
"day": "monday",
"open_time_session_one": "10:00",
"close_time_session_one": "21:00"
}
],
"cuisine": [
"Mexican, tacos, drinks"
],
"userId": 1
}
除“小时”外,所有字段均已填充。
答案 0 :(得分:4)
可能是您多次解码同一个BusinessAddRequest
变量。请注意,当您具有切片或映射的结构元素时,这将无法很好地工作(这同时适用于mapstructure
包和encoding/json
包!)。始终使用一个空的新变量。如果重复发生在循环中,请在循环主体中声明要解码的变量(每次运行循环时,它将是一个新副本)。
package main
import "encoding/json"
import "fmt"
import "github.com/mitchellh/mapstructure"
/* (your struct declaration not quoting it to save space) */
func main() {
var i map[string]interface{}
config := &mapstructure.DecoderConfig{
TagName: "json",
}
plan, _ := ioutil.ReadFile("zzz")
var data []interface{}
/*err :=*/ json.Unmarshal(plan, &data)
for j := 0; j < len(data); j++ {
i = data[j].(map[string]interface{})
var x BusinessAddRequest /* declared here, so it is clean on every loop */
config.Result = &x
decoder, _ := mapstructure.NewDecoder(config)
decoder.Decode(i)
fmt.Printf("%+v\n", x)
}
}
(请注意,我必须使用带有TagName="json"
的DecoderConfig才能使用您的结构定义,该结构定义用"json:"
而不是"mapstructure:"
标记)。
如果这没有帮助,请检查您自己的代码,并尝试找到一个与我在此处发布的示例类似的最小示例,以再现您的问题并将其添加到问题中。