LoginSignup
0
0

Go言語のJson出力をjson serverの形式に揃える方法

Posted at

はじめに

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要素がエスケープされていることだった.

main.go
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のものと同じにできる.
以下対処済みのコードとその出力

main.go
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
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0