JSONデータをコマンドライン上で扱う上で、とても便利な「jq」というツールをご存知か?
例えば以下のコマンドを実行すると、ものすごく手軽にJSONデータを整形して表示してくれるので便利。
コマンド実行例: 1
$ echo '{"hoge":"fuga"}' | jq { "hoge": "fuga" }
ただこのツールには一つ落とし穴があるので注意が必要(2019/11/03現在)
それは値の数値が大きくなりすぎると誤差が発生するということ。
例えば以下のコマンド例は、出力結果が何かおかしい事に気付くだろう。
コマンド実行例: 2
$ echo '{"hoge":12345678901234567}' | jq { "hoge": 12345678901234568 }
そう、[hoge]に対応する値は[12345678901234567]なので、末尾は[7]にならなければならないのに、JSON整形後の結果は末尾が[8]になっている。
公式のFAQによれば[2^53 (9007199254740992)]までの値しか扱うことができないとのこと。
実際に試してみたのが以下になる。
コマンド実行例: 3 (値に9007199254740992を与える)
$ echo '{"hoge":9007199254740992}' | jq { "hoge": 9007199254740992 }
コマンド実行例: 4 (値に9007199254740993を与える)
$ echo '{"hoge":9007199254740993}' | jq { "hoge": 9007199254740992 }
上記2つを見比べると、確かに値に[9007199254740992]を与えた例は正しく、[9007199254740993]を与えた例はおかしくなっている様だ。
それ以上の値(いわゆるBigInt)が想定される場合は、jqを利用しない方が良いかもしれない。
あるいは、きちんとこの問題を把握した上で、あくまで確認用として利用することをオススメする。
特に外部に公開されているAPIからのレスポンスを利用する様な場合は、とても大きな値をIDに取っていることも多いので注意。