Tony Stark
Tony Stark

Reputation: 2468

Unmarshalling JSON with GO fails, any hints?

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

Answers (1)

Bunyk
Bunyk

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

Related Questions