다음과 같은 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
두 번째 수준에 대해 테스트하려는 값을 알고 있다고 가정합니다.
jq 'del(.[][] | select(. == "null"))' file
이렇게 하면 값이 리터럴 문자열인 맨 위부터 시작하여 두 번째 수준의 모든 키-값 쌍이 제거됩니다 null
.
문제의 문서가 주어지면 예상되는 출력이 생성됩니다.
1.5보다 높은 버전을 사용하면 해당 값이 없는 비트를 jq
포함하도록 데이터를 업데이트할 수도 있습니다 .null
jq '.[][] |= select(. != "null")' file