Go gotcha: Why is the JSON output empty?

Package: encoding/json

Why does json.Marshal produce empty structs in the JSON text output?

type Person struct {
	name string
	age  int
}

p := Person{"Alice", 22}
jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))
{}
Answer

Only exported fields of a Go struct will be present in the JSON output.

type Person struct {
	Name string // Changed to capital N
	Age  int    // Changed to capital A
}

p := Person{"Alice", 22}

jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))
{"Name":"Alice","Age":22}

You can specify the JSON field name explicitly with a json: tag:

type Person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
}

p := Person{"Alice", 22}

jsonData, _ := json.Marshal(p)
fmt.Println(string(jsonData))
{"name":"Alice","age":22}

See JSON by example for an extensive guide to the Go JSON library.

Comments