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에서 위의 (더 유용한) 동작으로 변경되었습니다.문서변한 건 없어, 이건문서 오류인 것 같습니다..

답변2

두 번째 수준에 대해 테스트하려는 값을 알고 있다고 가정합니다.

jq 'del(.[][] | select(. == "null"))' file

이렇게 하면 값이 리터럴 문자열인 맨 위부터 시작하여 두 번째 수준의 모든 키-값 쌍이 제거됩니다 null.

문제의 문서가 주어지면 예상되는 출력이 생성됩니다.

1.5보다 높은 버전을 사용하면 해당 값이 없는 비트를 jq포함하도록 데이터를 업데이트할 수도 있습니다 .null

jq '.[][] |= select(. != "null")' file

관련 정보