programing

jq - 오브젝트의 부모 값을 인쇄하려면 어떻게 해야 합니까?

yoursource 2023. 3. 18. 14:22
반응형

jq - 오브젝트의 부모 값을 인쇄하려면 어떻게 해야 합니까?

변수 jsonVariable에 저장된 다음 JSON이 있다고 가정합니다.

{
    "id": 1,
    "details": {
        "username": "jamesbrown",
        "name": "James Brown"
    }
}

이 JSON을 jq와 함께 해석하려면 다음을 사용합니다.

echo $jsonVariable | jq '.details.name | select(.name == "James Brown")'

이렇게 하면 내가 얻을 수 있는 결과물을 얻을 수 있을 것이다.

제임스 브라운

하지만 이 사람의 신분증도 얻으려면 어떻게 해야 하나요?이것은 대략적이고 간단한 예라는 것을 알고 있습니다.현재 사용하고 있는 프로그램은 5~6레벨로 되어 있으며, 선택 이외의 많은 JQ기능이 있습니다.다양한 필터링 방법을 실행한 후 이미 5~6층 깊이의 부모 필드를 선택할 수 있는 방법이 필요합니다.

누구 도와줄 사람?부모에게 돌아갈 '뒤로 돌리기' 방법은 없나요? (내 말이 맞는지 잘 모르겠네요!)

보다 일반적인 접근 방식을 사용하려면 "상위" 요소의 값을 원하는 상세 수준으로 저장한 다음 필터 끝에 파이프합니다.

jq '. as $parent | .details.name | select(. == "James Brown") | $parent'

물론, 노출되는 사소한 경우, 이것은 완전히 생략할 수 있습니다.

jq 'select(.details.name == "James Brown")'

또한 선택한 필터가 단일 부모 개체에 대해 일치하는 항목을 많이 반환하는 경우 각 일치 항목에 대한 부모 개체의 복사본을 받는다는 점을 고려하십시오.선택한 필터가 부모 레벨 이하의 모든 일치 항목을 어레이로 정리하여 부모 레벨에서1개의 요소만 반환하도록 하거나 최종 결과를 중복 배제하여unique.

한 번 시도해 보세요.

echo $jsonVariable | jq '{Name: .details.name, Id: .Id}  | select(.name == "James Brown")'

테스트할 값까지 쿼리하는 것이 아니라 쿼리할 값과 선택할 값을 포함하는 루트 개체까지 쿼리합니다.

이 두 가지를 모두 포함하는 오브젝트가 필요합니다.id및 그name.

$ jq --arg name 'James Brown' 'select(.details.name == $name).id' input.json

언급URL : https://stackoverflow.com/questions/38689645/jq-how-do-i-print-a-parent-value-of-an-object-when-i-am-already-deep-into-the

반응형