This post is just a reminder as I work through handling JSON data with Go. Go provides first class JSON support through its standard library json
package. The interface is simple, primarily through json.Marshal
and json.Unmarshal
functions which are analagous to typed versions of json.load
and json.dump
. Type safety is the trick, however, and generally speaking you define a struct
to serialize and deserialize as follows:
type Person struct {
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
Salary int `json:"-"`
}
op := &Person{"John Doe", 42}
data, _ := json.Marshal(op)
var np Person
json.Unmarshall(data, &np)
So this is all well and good, until you start wanting to just send around arbirtray data. Luckly the json
package will allow you to do that using reflection to load data into a map[string]interface{}
, e.g. a dictionary whose keys are strings and whose values are any arbitrary type (anything that implements the null interface, that is has zero or more methods, which all Go types do). So you might see code like this:
Did you catch the surprise? That’s right, the age int
got deserialized as a float64
! Anyway, this whole post is about how long it took me to figure out that brand of reflection and how to avoid errors in the future.