[json] jq를 사용하여 객체의 변수 값을 기준으로 객체를 선택하십시오.

다음 json 파일이 있습니다.

{
    "FOO": {
        "name": "Donald",
        "location": "Stockholm"
    },
    "BAR": {
        "name": "Walt",
        "location": "Stockholm"
    },
    "BAZ": {
        "name": "Jack",
        "location": "Whereever"
    }
}

jq를 사용하고 있으며 ‘location’이 ‘Stockholm’인 객체의 “name”요소를 가져오고 싶습니다.

나는 모든 이름을

cat json | jq .[] | jq ."name"
"Jack"
"Walt"
"Donald"

그러나 하위 키 (여기 "location" : "Stockholm") 의 값이 주어지면 특정 객체 만 인쇄하는 방법을 알 수 없습니다 .



답변

jq로 JSON 처리 에 대한이 게시물에서 다음 select(bool)과 같이 사용할 수 있습니다 .

$ jq '.[] | select(.location=="Stockholm")' json
{
  "location": "Stockholm",
  "name": "Walt"
}
{
  "location": "Stockholm",
  "name": "Donald"
}


답변

이름의 스트림을 얻으려면 :

$ jq '.[] | select(.location=="Stockholm") | .name' json

생산 :

"Donald"
"Walt"

해당 (키 이름, “name”속성) 쌍의 스트림을 얻으려면 다음을 고려하십시오.

$ jq -c 'to_entries[]
        | select (.value.location == "Stockholm")
        | [.key, .value.name]' json

산출:

["FOO","Donald"]
["BAR","Walt"]


답변

비슷한 관련 질문이 있습니다. 원래 객체 형식을 키 이름 (예 : FOO, BAR)으로 되돌리려면 어떻게해야합니까?

Jq는 객체와 키-값 쌍 배열을 제공 to_entries하고 from_entries변환합니다. map선택 주위 와 함께

이 함수는 객체와 키-값 쌍의 배열 사이를 변환합니다. to_entries에 오브젝트가 전달되면 입력의 각 k : v 항목에 대해 출력 배열에 { “key”: k, “value”: v}가 포함됩니다.

from_entries는 반대 변환을 수행하며 with_entries (foo)는 to_entries의 약어입니다. 지도 (foo) | from_entries는 객체의 모든 키와 값에 대한 작업을 수행하는 데 유용합니다. from_entries는 키, 키, 이름, 이름, 값 및 값을 키로 허용합니다.

jq15 < json 'to_entries | map(select(.value.location=="Stockholm")) | from_entries'

{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}

with_entries속기를 사용하면 다음 과 같습니다.

jq15 < json 'with_entries(select(.value.location=="Stockholm"))'
{
  "FOO": {
    "name": "Donald",
    "location": "Stockholm"
  },
  "BAR": {
    "name": "Walt",
    "location": "Stockholm"
  }
}


답변