koukiblog

たぶんweb系の話題

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できます