GN⁺: JSON Path 사용법
(bump.sh)- JSON Path는 JSON 문서에서 데이터를 추출하는데 사용할 수 있는 쿼리 언어
- OpenAPI가 JSON 또는 YAML 문서이므로, JSON Path를 사용하여 OpenAPI에서 여러가지 작업을 할 수 있음
- OpenAPI Overlay를 사용하여 문서에 추가 내용, 코드 샘플 등을 패치
- Spectral에서 사용하여 고급 규칙 작성 가능
- AWS Step Functions에서도 사용 가능
- JSON Path 작동 방식
- JSON 데이터 구조를 탐색하고 필터링하며 특정 부분을 추출
- XPath와 유사한 문법 (XML에서 사용)
- 구문 예제:
$.store.book[?@.price < 10].title
- OpenAPI에서의 활용
-
jpp
명령을 사용하여 OpenAPI 문서를 쿼리하고 특정 부분 추출 가능 - Overlay를 사용하여 OpenAPI 문서를 수정하거나 정보를 추가하는데 사용
- 설명 업데이트, 연락처 정보 추가 등
- 서버 목록에서 개발/스테이징 서버 제거하고 프로덕션만 남기기
- 새로운 샌드박스 서버 정보 추가 등
-
- JSON Path에 대해 더 배우기
- 2024년 IETF에서 표준으로 제정 (RFC 9535)
- 이전에는 여러 변종이 존재했으나 표준화로 통일되는 추세
- RFC 9535 문법을 따르는 것이 좋음
GN⁺의 의견
- JSON Path는 점점 더 많은 곳에서 사용되고 있어 알아두면 유용한 기술임. 특히 OpenAPI를 다루는 개발자나 기술 작가에게 필수적인 스킬이 될 것으로 보임.
- 아직 JSON Path의 문법이 통일되지 않아서 약간의 혼란이 있지만, RFC 9535를 기준으로 삼는 것이 바람직해 보임. 앞으로 관련 도구들도 이 표준을 따를 것으로 기대됨.
- OpenAPI Overlay나 Spectral 등 개발 과정에서 활용할 수 있는 분야가 다양해 보임. 단순히 데이터 추출 뿐 아니라 문서 보완, 검증, 정제 등에도 활용 가능성이 높아 보임.
- 다만 문법이 약간 복잡하고 JSON/YAML에 익숙해야 하므로 진입 장벽이 있음. 간단한 방식으로 시작해서 점진적으로 고급 기능을 배워나가는 것이 좋겠음.
- jq나 yq 같은 커맨드라인 도구를 활용하면 연습하기 좋을 것 같음. Bump.sh 같은 통합 도구를 사용하는 것도 생산성에 도움이 될 것임.
Hacker News 의견
-
JSONata(https://jsonata.org)는 JSON 조작을 위한 최고의 도구 중 하나로, JsonPath 문법을 사용하며 노드 선택 외에도 산술, 비교, 정렬, 그룹화, 날짜 조작, 집계 등의 도우미 함수를 제공함. JS로 작성되어 Node나 브라우저에서 사용 가능하며, Python 래퍼(https://pypi.org/project/pyjsonata/)도 있음.
-
json_profile(https://github.com/tylerneylon/json_profile)은 새로운 JSON 파일의 주요 스키마와 데이터 위치를 빠르게 이해하는 데 도움을 주는 도구로, 리스트의 피어 요소가 동일한 구조를 가질 때 유용함. 파일 구조를 학습하고, 가장 무거운 집계 경로를 출력하며, 경로별 크기 힌트를 제공함.
-
espath(https://github.com/tomhodgins/espath)는 XPath와 CSS 선택자를 사용하여 JSON의 데이터를 필터링하고 찾는 라이브러리임. JavaScript 객체를 XML DOM으로 변환하고 쿼리를 실행한 후 다시 객체로 변환하거나, 원본 객체 레지스터를 유지하고 원본 객체를 검색하는 방식으로 동작함.
-
JSON이 나타내는 데이터 구조에 대한 일반적인 이름이 있는지에 대한 질문과 JSON, YAML, Python 딕셔너리, TOML 등 유사한 구조에서 작동하는 경로 언어의 필요성에 대한 언급이 있음.
-
SQLite는 json_extract()와 같은 함수에서 사용되는 JSON Path의 하위 집합을 코어 데이터베이스에 포함하고 있음. 관련 상세 노트: https://til.simonwillison.net/sqlite/json-extract-path
-
Insomnia와 Bruno는 JSON Path를 사용하여 응답을 필터링하는 기능이 있음.
-
PostgreSQL의 jsonpath 지원을 사용하여 DB 행에 대한 사용자 정의 필터링 규칙을 만드는 데 사용했음.
-
XPATH 인젝션이 널리 사용되었던 것처럼 JSON 경로 인젝션 공격이 불가피할 것으로 예상됨. (https://owasp.org/www-community/attacks/XPATH_Injection 참조)
-
jq와 같은 유사한 도구에 대한 언급이 없는 것이 의아함.
-
너무 많은 JSON 경로 구문이 있어서 아쉬움. jq, JSON path, AWS CLI, MySQL 등 각각 다른 구문을 사용하므로 근육 기억을 얻기 어려움.