Luman75 Luman75 - 4 months ago 18
JSON Question

Complex JSON marshaling to GoLang objects

I need to marshal complex JSON object to GO structure.

So I have source:

"NetworkSettings": {
"Bridge": "",
"SandboxID": "e9736755bc41db307019fde3be0feed51086e6d3e23b0213c59bb5e43f7af214",
"HairpinMode": false,
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "2ee283787f45894c3383229d29ada1ccbb7f34b1c1e143e417e7ba75b7f5ebce",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "1c4788fac19973ddc73975613a2aef5a4cc2be446af458c06fa5fa162e8126ff",
"EndpointID": "2ee283787f45894c3383229d29ada1ccbb7f34b1c1e143e417e7ba75b7f5ebce",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}


and I need to map it into object like this:

NetworkSettings struct {
IpAddress string
SandboxID string
Gateway string
Ports map[string][]Binding
Networks map[string]map[string]string
}


However because of
Networks map[string]map[string]string
I'm getting error

json: cannot unmarshal object into Go value of type string
error restoring containers: json: cannot unmarshal object into Go value of type string


But this is what I need to have a complex map of map structure.

Any idea how to do that?

Answer

That error happens because some of the values in the JSON aren't strings, but are integers (IPPrefixLen for example), and therefore can't be assigned to a string variable.

There are 2 ways to address this. You could use the interface{} type, so your type definition would become:

NetworkSettings struct {
    IpAddress string
    SandboxID string
    Gateway   string
    Ports     map[string][]Binding
    Networks  map[string]map[string]interface{}
}

A better solution would probably be to define a type for the Network block:

type Network struct {
    NetworkID   string 
    EndpointID  string
    Gateway     string
    IPAddress   string
    IPPrefixLen int
    //etc...
}
type NetworkSettings struct {
    IpAddress string
    SandboxID string
    Gateway   string
    Ports     map[string][]Binding
    Networks  map[string]Network
}
Comments