Reputation: 2468
Please take a look at the following structure and tell me why I can't unmarshall it.
type Server struct {
Etcd [] struct {
CertCn string `json:"cert_cn"`
} `json:"etcd"`
}
type CertExpiryReport struct {
Data struct {
Servers map[string]*Server
} `json:"data"`
Summary struct {
Expired int `json:"expired"`
Ok int `json:"ok"`
Total int `json:"total"`
Warning int `json:"warning"`
} `json:"summary"`
}
The following is the JSON content.
{
"data": {
"myserver1.mydomain1.org": {
"etcd": [
{
"cert_cn": "CN:something"
}
]
}
"myserver2.mydomain2.org": {
"etcd": [
{
"cert_cn": "CN:something"
}
]
}
},
"summary": {
"expired": 0,
"ok": 31,
"total": 31,
"warning": 0
}
}
This is my code.
func printStuff() {
bytes, err := ioutil.ReadFile(jsonFile)
if err != nil {
log.Errorf("%s", err.Error())
os.Exit(1)
}
var certExpiryReport CertExpiryReport
err = json.Unmarshal(bytes, &certExpiryReport)
if err != nil {
log.Errorf("%s", err.Error())
os.Exit(1)
}
log.Info(certExpiryReport)
}
The output is the following. I am not getting any errors.
{{map[]} {0 31 31 0}}
Why can't GO parse the JSON? Is something wrong with my structs?
Upvotes: 0
Views: 99
Reputation: 8067
There is something wrong with the struct (or JSON). CertExpiryReport struct has additional level of nesting in Data field. Try to replace
Data struct {
Servers map[string]*Server
} `json:"data"`
With
Data map[string]*Server `json:"data"`
Also, your JSON gives me error (you forgot comma after first server description). Here is working test with change to your structs and JSON: https://play.golang.org/p/QwnHGc9MElb
Other way would be to put inside JSON "data" field "servers" field, and store content of data there. If you need more nesting.
Upvotes: 3