다음 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"
}
}