golang の html/template で JSON を整形する

2023年8月27日 engineering

こんにちは、 @kz_morita です。

golang で html/template でHTMLを返すときに、JSON の整形をする方法についてのメモです。

結論

sprig というライブラリを使用すると、golang の HTML template 内で便利な関数を使えるようになります。

そのなかに、toPrettyJson という物があるので使用すると JSON をいい感じにフォーマットしてくれます。

import (
    "html/template"
    "github.com/Masterminds/sprig/v3"
)

type Response struct {
    Body string `json:"body"`
}

func Handler(w http.Response, r *http.Request) {
    resp := Response { Body: "{\"hoge\": \"fuga\"}" }
    parameter := map[string]interface{}{"body": resp}

    temp, err := template.New("index.html").Funcs(sprig.FuncMap()).ParseFiles("index.html")
    if err != nil { /* ... */ }

    err = temp.Execute(w, parameter)
}
index.html
<pre>
    <code>{{ toPrettyJson .body }}</code>
</pre>

もうちょっと中身を見る

sprig.FuncMap() という関数から帰ってくる値を html/template の Funcs 関数にわたすと、template 側へ便利関数を渡すことができます。

FuncMap の中を見てみると以下のようになってます。

func FuncMap() template.FuncMap {
    return HtmlFuncMap()
}

template.FuncMap 型を返しています。

更に追っていくと以下のような map が定義してあり、それを template.FuncMap 型に変換していることがわかります。

var genericMap = map[string]interface{}{
    "hello": func() string { return "Hello!" },

    // ....
    "toPrettyJson":    toPrettyJson
    // ....
}

toPrettyJson の実態は以下のような関数で

func toPrettyJson(v interface{}) string {
    output, _ := json.MarshalIndent(v, "", "  ")
    return string(output)
}

実態は、json.MarshalIndent をしているだけでした。

このような便利関数がいくつも登録しているので、golang で直接 HTML を生成して返すようなサーバーを書くときに役立ちそうです。

まとめ

今回は golang で html/template 使用時に、JSON をフォーマットして表示する方法について書きました。 sprig ライブラリは非常に便利そうです。

この記事をシェア