年中アイス

いろいろつらつら

GoでJSON文字列を整形し直す

Goで、JSONを返すWebAPIを呼んだ時、普通は結果をプログラムで使うので、対応する構造体を用意して、json.Unmarshal()などで変換します。

しかし、JSONをそのまま整形だけして出力したい場合があります。例えば、WebAPIを呼んで、そのレスポンスを見せるだけとか。curl | jq .みたいな感じ。

JSON自体の文字列がある時は、Unmarshal() -> 構造体 -> Marshal()ということまではする必要はなく、json.Indent()を使います。

func Indent(dst *bytes.Buffer, src []byte, prefix, indent string) error

prefixは空文字で、indentの方にインデントに使う文字列を渡します。ここでは半角スペース2個指定。

j := `{"key":"value","obj":{"obj_key":"obj_value"}}`
var buf bytes.Buffer
err := json.Indent(&buf, []byte(j), "", "  ")
if err != nil {
  panic(err)
}
indentJson := buf.String()

これを使うと、以下のように変換できます。

{"key":"value","obj":{"obj_key":"obj_value"}}

{
  "key": "value",
  "obj": {
    "obj_key": "obj_value"
  }
}

ちなみに改行インデントなしからだけでなく、2スペースからタブへの変換といった整形し直しも可能です。

逆に、インデントを全てなくす場合はjson.Compact()を使います。

func Compact(dst *bytes.Buffer, src []byte) error

使い方はIndent()のprefix, indent引数がないだけです。

全体のgo playgroundはこちら