Doug Knesek Doug Knesek - 4 months ago 12
JSON Question

Go json.Marshal(struct) returns "{}"

type TestObject struct {
kind string `json:"kind"`
id string `json:"id, omitempty"`
name string `json:"name"`
email string `json:"email"`
}

func TestCreateSingleItemResponse(t *testing.T) {
testObject := new(TestObject)
testObject.kind = "TestObject"
testObject.id = "f73h5jf8"
testObject.name = "Yuri Gagarin"
testObject.email = "Yuri.Gagarin@Vostok.com"

fmt.Println(testObject)

b, err := json.Marshal(testObject)

if err != nil {
fmt.Println(err)
}

fmt.Println(string(b[:]))
}


Here is the output:

[ `go test -test.run="^TestCreateSingleItemResponse$"` | done: 2.195666095s ]
{TestObject f73h5jf8 Yuri Gagarin Yuri.Gagarin@Vostok.com}
{}
PASS


Why is the JSON essentially empty?

Answer

You need to export the fields in TestObject by starting the name with an uppercase character.

type TestObject struct {
 Kind string `json:"kind"`
 ID   string `json:"id, omitempty"`
 Name  string `json:"name"`
 Email string `json:"email"`
}

The encoding/json package and similar packages ignore unexported fields.

playground