次のJSONがあるとします。
{
"key1": {
"keyA": "1",
"keyB": "null",
"keyC": "null"
},
"key2": {
"keyA": "null",
"keyB": "3",
"keyC": "null"
}
}
null
JSONに値を持つすべてのキーを除外する方法を見つけたいです。結果は次のとおりです。
{
"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
。デモ) 同じキーを削除します。
値がnull
stringではなくtrueの場合は、完全ではなく組み込み関数を"null"
使用できます。nulls
select
del(..|nulls)
値がtrueの場合はnullそしてあなたは使用していますjq 1.5recurse(.[]?; true)
(多くのディストリビューションで現在のバージョン)を代わりに使用する必要があります..
。これは、NULL値が明示的に除外されるためです..
。それは次のように定義されますrecurse
、どちら~として定義された recurse(.[]?)
、これは)として定義されますrecurse(.[]?; . != null)
。ただし、この動作は1.6から上記の(より便利な)動作に変更されました。文書変わったことはない、これはドキュメントエラーのようです。。
答え2
2番目のレベルについてテストしたい値を知っているとします。
jq 'del(.[][] | select(. == "null"))' file
これにより、値がリテラル文字列の先頭から始まり、2番目のレベルのすべてのキーと値のペアが削除されますnull
。
問題の文書が与えられると、予想される出力が生成されます。
1.5より高いバージョンでは、値がないビットをjq
含むようにデータを更新することもできます。null
jq '.[][] |= select(. != "null")' file