読者です 読者をやめる 読者になる 読者になる

#19 指定ディレクトリ以下の json ファイルの syntax check を行うスクリプトを作りました

この記事は tech.kayac.com Advent Calendar 2014 19日目です。

業務の30 ~ 40% くらいは chef の cookbook を書いている @tkuchiki です。

chef の node や role の定義を json で行うと思います。
cookbook 作成中に、chef-solo や chef-client を走らせてテストしようとしたときに、
json の syntax error で実行に失敗するということありませんか?

そんなとき、json で消耗しないために作ったのが json-checker です。

インストール

以下のコマンドを実行してください。

curl https://raw.githubusercontent.com/tkuchiki/json-checker/master/json-checker -o /usr/local/bin/json-checker && chmod +x /usr/local/bin/json-checker

使い方

使い方は -h で見られます。

オプションの説明をすると、

  • -r : ディレクトリを再帰的に探索する
  • -L : symlink をたどる
  • -q : 標準出力に何も表示せず、ステータスコードのみを返す
$ json-checker -h
Usage: json-checker [option] ARG...

ARG    file and directory

Options:
  -h, --help       show this help message and exit
  -r, --recursive  check directories recursively
  -L               follow symlinks
  -q, --quiet      quiet mode

実行例

$ tree example
example
├── foo
│?? └── bar.json
└── test.json

1 directory, 2 files

というディレクトリ構成で、example/test.json が正しい syntax の json、example/foo/bar.json が正しくない syntax の json ファイルです。

このような場合に、

$ json-checker example
/private/tmp/example/test.json
syntax ok

ok:     1
error:  0

と実行すると、example 以下のファイルだけ syntax check します。

-r をつけると、

$ json-checker -r example
/private/tmp/example/test.json
syntax ok

/private/tmp/example/foo/bar.json
syntax error
Expecting object: line 1 column 1 (char 1)

ok:     1
error:  1

再帰的にディレクトリをたどって、syntax check してくれます。

-q をつけると、

$ json-checker -q  example
$ echo $?
0

$ json-checker -q -r example
$ echo $?
1

syntax check に引っかからなければ 0、syntax check に引っかかったら 1 を返します。

$ ln -s /tmp/example/foo example/hoge
$ tree example
example
├── foo
│?? └── bar.json
├── hoge -> /tmp/example/foo
└── test.json

2 directories, 2 files

のような構成で、-L をつけないと

$ json-checker -r  example
/private/tmp/example/test.json
syntax ok

/private/tmp/example/foo/bar.json
syntax error
Expecting object: line 1 column 1 (char 1)

ok:     1
error:  1

symlink を無視しますが、 -L をつけると、

$ json-checker -r -L example
/private/tmp/example/test.json
syntax ok

/private/tmp/example/foo/bar.json
syntax error
Expecting object: line 1 column 1 (char 1)

/private/tmp/example/hoge/bar.json
syntax error
Expecting object: line 1 column 1 (char 1)

ok:     1
error:  2

symlink をたどって syntax check してくれます。

help にも README にも書いていませんが、拡張子が .json 以外のファイルは無視しますので、
.json 以外の json ファイルは syntax check できないのでご注意ください。
あと、python 2.6 以上の環境でないと動きません(3 系で動くかはわかりません…)。

終わりに

json の syntax check を行うスクリプトの紹介をしました。
使用するケースが限られるかもしれませんが、何かのお役に立てれば光栄です。

明日は

2年ぶりの投稿となる、@ken39arg さんです。
お楽しみに!