jsongomarshalling

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?


Solution

  • You need to export the fields in TestObject by capitalizing the first letter in the field name. Change kind to Kind and so on.

    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.

    The `json:"..."` strings that follow the field declarations are struct tags. The tags in this struct set the names of the struct's fields when marshaling to and from JSON.

    Run it on the playground.