web-dev-qa-db-ja.com

stringがjqで有効なJSONかどうかを確認します

サービスを解除するときにエラーをキャッチする必要があります。応答はnullのような文字列エラーメッセージです。

error services-migration/foobar: Not found: services-migration/foobar

またはすべてが正常な場合は有効なJSON。 jqを使用して、指定された文字列が有効なJSONであるかどうかを簡単に確認する方法があるかどうか疑問に思っていました。 error f.e.のようないくつかのキーワードの文字列を確認することもできますが、より堅牢なオプションを探しています。 true/false または 1/0 jqから。私はjqのドキュメントと、ここでSOについてのいくつかの質問を調べましたが、すべてはJSONからKey-Valueを見つけて取り出すことについてでしたが、文字列。

更新:

私はこれを持っています:

 result=$(some command)

結果は文字列error services-migration/foobar: Not found: services-migration/foobar

そして、ifステートメント:

 if jq -e . >/dev/null 2>&1 <<<"$result"; then
    echo "it catches it"
 else
    echo "it doesn't catch it"
 fi

そして、それは常にelse句になります。

22
Milkncookiez

マニュアルから:

-e/--exit-status:

最後の出力値がfalseまたはnullのいずれでもなかった場合はjqの終了ステータスを0に設定し、最後の出力値がfalseまたはnullの場合は1、有効な結果が生成されなかった場合は4に設定します。通常、jqは、使用上の問題またはシステムエラーが発生した場合は2、jqプログラムのコンパイルエラーが発生した場合は3、jqプログラムが実行された場合は0で終了します。

以下を使用できます。

if jq -e . >/dev/null 2>&1 <<<"$json_string"; then
    echo "Parsed JSON successfully and got something other than false/null"
else
    echo "Failed to parse JSON, or got false/null"
fi

実際、異なる種類のエラーを区別する必要がない場合は、-eスイッチ。この場合、有効なJSON(false/nullを含む)と見なされるものはすべて、フィルター.とプログラムは正常に終了するので、ifブランチに従います。

21
Tom Fenech

これは私のために働いています

echo $json_string | ./jq -e . >/dev/null 2>&1  | echo ${PIPESTATUS[1]}

戻りコードを返します:

  • 0-成功
  • 1-失敗
  • 4-無効

その後、さらにコードでリターンコードを評価できます。

9
Reddy SK