JSON 데이터 변환
이제 JSON 데이터를 다른, 더 유용한 형식으로 변환하는 방법을 살펴보겠습니다.
여기서 우리의 목표는 운영 시간을 더 읽기 쉽게 만드는 것입니다. 특히, 명소가 24 시간 운영되는 경우 "Open 24 hours"를 표시하고, 그렇지 않은 경우 기존 운영 시간 텍스트에 "Open " 접두사를 추가하려고 합니다.
이를 수행하려면 다음 명령을 사용하십시오.
cat ~/project/data.txt | jq '.[] | {name: .name, location: .location, opening_hours: (.opening_hours | if . == "24 hours" then "Open 24 hours" else "Open \(.)" end)}'
이 명령은 다음과 같은 출력을 생성합니다.
{
"name": "The Great Wall of China",
"location": "Shanxi Province",
"opening_hours": "Open 24 hours"
}
{
"name": "Terracotta Warriors",
"location": "XiAn",
"opening_hours": "Open 9:00 AM - 5:00 PM"
}
변환을 이해해 보겠습니다. 이전과 마찬가지로 cat ~/project/data.txt | jq '.[]'는 파일을 읽고 배열의 각 명소를 반복하여 시작합니다. 이 변환의 핵심은 객체 구성과 if-else 문에 있습니다.
{name: .name, location: .location, opening_hours: ...}는 원래 객체에서 데이터를 가져와 새 JSON 객체를 생성합니다. 원래 객체의 name과 location을 직접 포함합니다. 그러나 opening_hours 필드의 값은 더 복잡합니다.
(.opening_hours | if . == "24 hours" then "Open 24 hours" else "Open \(.)" end)는 원래 opening_hours의 값을 가져와 처리합니다.
.opening_hours는 원래 운영 시간 값을 선택합니다.
if . == "24 hours" then "Open 24 hours" else "Open \(.)" end 문은 원래 opening_hours가 정확히 "24 hours"와 같은지 확인합니다. 그렇다면 값은 "Open 24 hours"로 바뀝니다. 그렇지 않은 경우 "Open "이 기존 opening_hours에 접두사로 추가됩니다. 문자열 내에 값을 포함할 수 있게 해주는 \(.)의 사용에 유의하십시오.
본질적으로, 이 명령은 각 명소에 대해 새 객체를 생성하고 opening_hours 값을 사용자가 더 읽기 쉽도록 조정하여 데이터를 변환합니다.