jqを使用してJSONから特定の値を持つすべてのキーを除外する方法は?

jqを使用してJSONから特定の値を持つすべてのキーを除外する方法は?

次のJSONがあるとします。

{
    "key1": {
        "keyA": "1",
        "keyB": "null",
        "keyC": "null"
    },
    "key2": {
        "keyA": "null",
        "keyB": "3",
        "keyC": "null"
    }
}

nullJSONに値を持つすべてのキーを除外する方法を見つけたいです。結果は次のとおりです。

{
    "key1": {
        "keyA": "1"
    },
    "key2": {
        "keyB": "3"
    }
}

特定のキーとその名前の除外を使用できることがわかりますjq。たとえば、これcat myjson.json | jq 'del(.[]|.keyA)'を行うとjsonのすべてのキーが削除されますが、その値に基づいてキーを除外したいと思います。keyA値を持つすべての"null"キー除外をどのように使用できますかjq

ベストアンサー1

del(..|select(. == "null"))

これは以下を使用します。再帰下降演算子..そしてselect機能オブジェクト内の値が同じ場所のすべての場所を見つけて"null"割り当てますdel。ツリーの各値をここに割り当て、位置を生成するすべての式を受け入れるselect間に特定の値が含まれているかどうかを判断するために、ブール式を評価します。 (..delデモ)

このpath機能を使用して、見つかった内容を確認できます。

path(..|select(. == "null"))

まず、削除しようとしていると思われる項目をデバッグします。これ出力キー配列であり、値に再帰的に到達するため、配列の最後の項目が削除される実際のキーです。

jq 1.6以降では、更新割り当てを使用することもできます|= empty(以前のバージョンでは自動的に失敗します)。この内容がより明確である場合もそうでない場合もあります(..|select(. == "null")) |= emptyデモ) 同じキーを削除します。


値がnullstringではなくtrueの場合は、完全ではなく組み込み関数を"null"使用できます。nullsselectdel(..|nulls)

値がtrueの場合はnullそしてあなたは使用していますjq 1.5recurse(.[]?; true)(多くのディストリビューションで現在のバージョン)を代わりに使用する必要があります..。これは、NULL値が明示的に除外されるためです..それは次のように定義されますrecurse、どちら~として定義された recurse(.[]?)、これは)として定義されますrecurse(.[]?; . != null)。ただし、この動作は1.6から上記の(より便利な)動作に変更されました。文書変わったことはない、これはドキュメントエラーのようです。

おすすめ記事