user568109 user568109 - 2 months ago 6
JSON Question

Why struct fields are showing empty?

I am struggling to get the correct output from the following code:

package main

import (
"encoding/json"
"fmt"
)

func main() {

var jsonBlob3 = []byte(`[
{"name": "Platypus", "spec": "Monotremata", "id":25 },
{"name": "Quoll", "spec": "Dasyuromorphia", "id":25 }
]`)
type Animal2 struct {
name string
spec string
id uint32
}
var animals []Animal2
err := json.Unmarshal(jsonBlob3, &animals)
if err != nil {
fmt.Println("error:", err)
}
fmt.Printf("%+v\n", animals)
}


Playground snippet

The struct field are empty when printed. I am sure there is a dumb mistake somewhere but I am still new to Go and I have been stuck at this for hours. Please help.

Answer

This has come up so many times. The problem is that only exported fields can be marshaled/unmarshaled.

Export the struct fields by starting them with capital (upper-case) letters.

type Animal2 struct {
    Name  string
    Spec string
    Id uint32
}

Try it on the Go Playground.

Note that the JSON text contains the field names with lowercased text, but the json package is "clever" enough to match them. If they would be completely different, you could use struct tags to tell the json package how they are found (or how they should be marshaled) in the JSON text, e.g.:

type Animal2 struct {
    Name  string `json:"json_name"`
    Spec string  `json:"specification"`
    Id uint32    `json:"some_custom_id"`
}
Comments