Goで任意のJSONオブジェクトを文字列のままUnmershalする
{ "id": 1 "payload": { "a":1 } }, { "id": 2 "payload": { "b":2 } },
こういうJSONをGoで扱うときに、payload要素を、{"a": 1}, {"b": 2 } のように文字列そのままで取得したいときの方法です。
DBやBigQueryにjsonのまま保存したいみたいな用途です。
jsonstringという構造体を定義して、
type jsonstring struct { Body string } func (js jsonstring) MarshalJSON() ([]byte, error) { return []byte(js.Body), nil } func (js *jsonstring) UnmarshalJSON(data []byte) error { *js = jsonstring{Body: string(data)} return nil } func (js jsonstring) String() string { return js.Body }
それをUnmarshalする構造体の型に指定する。
type Item struct { Id string `json:"text"` Payload jsonstring `json:"payload"` }
するとUnmarshalできます