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はこちら