[jq] try catch で変換エラーを処理する

作成日: 2026年10月27日

jq の try catch を使用すると、フィルターの実行中に発生したエラーを処理できます。数値に変換できない文字列が混ざっている場合などに利用できます。

下記の例では、配列内の文字列を tonumber で数値に変換し、変換に失敗した値を null に置き換えています。

printf '%s\n' '["10","invalid","20"]' | jq 'map(try tonumber catch null)'

実行結果は下記のとおりです。

[
  10,
  null,
  20
]

try フィルター catch エラー時の処理 の形で指定します。この例では、"invalid" に対する tonumber の実行でエラーが発生するため、catch null が null を返します。

変換に失敗した要素を除外する

catch を省略した try フィルター は、エラーが発生した場合に値を出力しません。map と組み合わせると、変換に失敗した要素を結果の配列から除外できます。

printf '%s\n' '["10","invalid","20"]' | jq 'map(try tonumber)'

実行結果は下記のとおりです。

[
  10,
  20
]

try tonumber は try tonumber catch empty と同じ動作になります。失敗した要素の位置を残したい場合は catch null、成功した要素だけが必要な場合は try tonumber のように使い分けられます。

この例で処理しているのは tonumber の実行時エラーです。入力全体が不正な JSON の場合は、フィルターの実行前の解析でエラーになります。

参考

jq