Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

jqの落とし穴にご注意を

JSONデータをコマンドライン上で扱う上で、とても便利な「jq」というツールをご存知か?

stedolan.github.io

 

例えば以下のコマンドを実行すると、ものすごく手軽に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に取っていることも多いので注意。

 

連絡先: plugout777★yahoo.co.jp (クローラー対策のため★を@に変更してください)