Reputation: 959
I am trying to decode a map[string]interface{}
to a struct, but the "hours" field is not getting populated. I am using https://github.com/mitchellh/mapstructure for decoding. This is the struct:
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"`
}
And this is the example data:
{
"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
}
All fields are getting populated except "hours".
Upvotes: 3
Views: 16432
Reputation: 5354
It could be that you're decoding multiple times into the same BusinessAddRequest
variable. Note this doesn't work well when you have structure elements that are slices or maps (this applies BOTH to the mapstructure
package and to encoding/json
as well!). Always use an empty new variable. If the repetition happens in a loop, declare the variable that you decode to in the loop body (it will be a new copy every time you run through the loop).
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)
}
}
(note I had to use a DecoderConfig with TagName="json"
to be able to use your structure definition, which is tagged with "json:"
and not "mapstructure:"
).
If this doesn't help, please check your own code and try to find a minimal example similar to what I posted here that reproduces your problem and add it to the question.
Upvotes: 7