はじめに
Go言語で集めたデータをjsonで保存.そのjsonをjson-serverでホストしてフロントエンドから取得,及び変更する簡易な自作ツールを作成していた.
運用期間を延ばしてもそこまでjsonが肥大化する性質のツールではないためjsonもGitリポジトリで管理したい.しかし,Go言語標準ライブラリのjson encoderのデフォルトの出力形式とjson-server側で変更した際に整形される形式が異なっている.
そのため,Go言語でデータ取得した後json-serverの変更が実行された場合や,json-serverの変更が実行された後に再度Go言語でデータを取得した場合にGit上ではファイル全てが書き換えられたように認識されてしまい変更履歴が機能しない.
なのでGo言語標準ライブラリのjson encoderの出力形式をjson-serverと同じ形式にしたい.
対処
以下愚直にjson encoderを使用したコードとその出力.json-serverの形式と違う部分は1行にまとめられていることとHtml要素がエスケープされていることだった.
package main
import (
"encoding/json"
"os"
)
func main() {
type Message struct {
Name string
Body string
Int int64
}
m := Message{"title", "<body>content</body>", 4355}
enc := json.NewEncoder(os.Stdout)
enc.Encode(m)
}
{"Name":"title","Body":"\u003cbody\u003econtent\u003c/body\u003e","Int":4355}
Go言語json encoderにはインデント形式を変更する関数SetIndentとHtmlエスケープの有効無効を制御する関数SetEscapeHTMLがあるのでこのオプションを設定することで出力形式をjson-serverのものと同じにできる.
以下対処済みのコードとその出力
package main
import (
"encoding/json"
"os"
)
func main() {
type Message struct {
Name string
Body string
Int int64
}
m := Message{"Alice", "<body>content</body>", 4355}
enc := json.NewEncoder(os.Stdout)
enc.SetEscapeHTML(false)
enc.SetIndent("", " ")
enc.Encode(m)
}
{
"Name": "Alice",
"Body": "<body>content</body>",
"Int": 4355
}