jrf jrf - 3 years ago 227
JSON Question

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?

Answer Source

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.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download