jrf
jrf

Reputation: 41

Go json.Unmarshal field case

I'm new to Go. I was trying to fetch and marshal json data to a struct. My sample data looks like this:

var reducedFieldData = []byte(`[
    {"model":"Traverse","vin":"1gnkrhkd6ej111234"}
    ,{"model":"TL","vin":"19uua66265a041234"}
]`)

If I define the struct for receiving the data like this:

type Vehicle struct {
    Model string
    Vin   string
}

The call to Unmarshal works as expected. However, if I use lower case for the fields ("model" and "vin") which actually matches cases for the field names in the data it will return empty strings for the values.

Is this expected behavior? Can the convention be turned off?

Upvotes: 2

Views: 2444

Answers (1)

Milo Christiansen
Milo Christiansen

Reputation: 3294

Fields need to be exported (declared with an uppercase first letter) or the reflection library cannot edit them. Since the JSON (un)marshaller uses reflection, it cannot read or write unexported fields.

So yes, it is expected, and no, you cannot change it. Sorry.

You can add tags to a field to change the name the marshaller uses:

Model string `json:"model"`

See the documentation for more info on the field tags "encoding/json" supports.

Upvotes: 4

Related Questions