なぜ作ったか
JSONはJavaScriptと違ってコメントを含められないのですが、APIドキュメントでサンプルデータを書くときは便宜的にコメントを書いたりします。
そこで、コメントを削除して、ついでにミニファイするユーティリティをライブラリとコマンドラインツールとして作成してみました。
Goでlexerを作る
Goでlexerを書く手法の一つとしてLexical Scanning in Go - Rob Pike - YouTubeがあります。Go標準ライブラリtext/templateのtext/template/parse/lex.goはこの手法で実装されています。
lexerの状態をstateFnという関数で表すのと、lexerが処理したトークンをchannelでやりとりすることにより、lexerの実装をすっきり書けるのが特徴です。
type stateFn func(*lexer) stateFn
上のlexerの仕組みをそのまま真似た版
hnakamur/jsonpreprocessのバージョンでは上のlexerの仕組みをそのまま真似た実装となっています。
使い方のサンプル。ミニファイするコマンドラインツールのソースはこちらです。
jsonpreprocess/minifyjson/main.go at e6a36e006e4f8b8c145972a867ce474fa8299b4d · hnakamur/jsonpreprocess
(このバージョンの時点ではパッケージ名がjsonutilだったので、go getした後にディレクトリ名を変えるか、ソースでjsonutilをjsonpreprocessに変更する必要があります。)
lexerのinputをstringからio.Readerに変えた版
lexerのinputがstringだと巨大なファイルを読み込むときに内容をメモリ上に読み込まれてしまうのがいまいちです。そこでinputをstringではなくio.Readerにするように改良してみました。
hnakamur/jsonpreprocess
使い方のサンプル。ミニファイするコマンドラインツールのソースはこちらです。
jsonpreprocess/minifyjson/main.go at master · hnakamur/jsonpreprocess