jq - Assertは正確に1つの要素を返します。

jq - Assertは正確に1つの要素を返します。

次のjqスニペットを使用して、値の配列からキーを抽出します。

jq '[.[].refreshToken | select(. != null)] | unique]'

1つの要素だけが返されたとどのように主張しますか?結果の配列に2つ以上の要素がある場合は、ゼロ以外のステータスコードが返されます。それ以外の場合、結果のJSON配列に1つの要素が含まれます。


   [{
      "tokenType":"Bearer",
      "expiresIn":3599,
      "expiresOn":"2021-09-28 17:41:15.929902",
      "resource":"https://management.core.windows.net/",      
      "accessToken":"lkZXIuZ2mn_A",
      "refreshToken":"0.AYIAGNEIQ9HtAEOq4v1k",
      "oid":"0000-ea77-4abe-961b-0000",
      "userId":"[email protected]",
      "isMRRT":true,
      "_clientId":"0000-0000-0000-0000",
      "_authority":"https://login.microsoftonline.com/common"
   }]

答え1

jq対応する(または)コマンドラインオプションを使用すると、最後に評価された値に対応する終了状態でユーティリティを終了させることができます。--exit-status-e

jq -r -e '[.[] | select(.refreshToken != null)] | unique | if length == 1 then .[].refreshToken else empty end' file

上記の式で評価された最後のステートメントがtrueで空でなく、nullでない場合、終了ステータスはjq0になります。それ以外の場合はゼロではありません。

コメントは、私たちが探しているものがrefreshTokenデータであることを示します。ただし、それが固有の場合にのみ該当します。あなたはこれを行うことができます

jq -r -e '[.[].refreshToken // empty] | unique | if length == 1 then .[] else empty end' file

答え2

解決済み:jq -r '([.[].refreshToken | select(. != null)] | unique) as $r | if $r | length == 1 then $r | .[] else null end'

関連情報