JSON에서 YAML로 변환: 완벽 마이그레이션 가이드
JSON과 YAML은 서로 다른 구문으로 동일한 데이터 구조를 표현합니다. 대부분의 경우 변환은 간단하지만, 타입, 멀티라인 문자열, 주석 관련 엣지 케이스에는 주의가 필요합니다. 이 가이드에서는 포맷 간 완전한 매핑을 다룹니다.
구문 매핑
객체 / 매핑
JSON:
{
"database": {
"host": "localhost",
"port": 5432,
"name": "myapp"
}
}
YAML:
database:
host: localhost
port: 5432
name: myapp
배열 / 시퀀스
JSON:
{
"servers": ["web1", "web2", "web3"]
}
YAML:
servers:
- web1
- web2
- web3
중첩 구조
JSON:
{
"services": [
{
"name": "api",
"ports": [8080, 8443],
"env": {"NODE_ENV": "production"}
}
]
}
YAML:
services:
- name: api
ports:
- 8080
- 8443
env:
NODE_ENV: production
JSON에서 YAML 변환기로 즉시 변환하세요.
주의할 엣지 케이스
1. 주석
YAML은 주석을 지원하지만 JSON은 지원하지 않습니다. YAML을 JSON으로 변환하면 모든 주석이 사라집니다:
# 이 주석은 JSON에서 사라집니다
database:
host: localhost # 이것도 사라집니다
2. 멀티라인 문자열
YAML은 JSON에 없는 강력한 멀티라인 구문을 가지고 있습니다:
description: |
이것은 줄 바꿈을
유지하는 멀티라인
문자열입니다.
JSON에서는 이렇게 됩니다:
{
"description": "이것은 줄 바꿈을\n유지하는 멀티라인\n문자열입니다.\n"
}
3. 타입 모호성
YAML은 자동으로 타입을 감지하여 문제가 발생할 수 있습니다:
version: 1.0 # 부동소수점, "1.0" 문자열이 아님
port: 080 # 8진수 64, "080" 문자열이 아님
country: NO # 불리언 false, "NO" 문자열이 아님
JSON에서는 타입이 명시적입니다:
{
"version": "1.0",
"port": "080",
"country": "NO"
}
JSON을 YAML로 변환할 때 잘못 해석될 수 있는 값에는 따옴표를 추가하세요.
4. Null 값
둘 다 null을 지원하지만 구문이 다릅니다:
value: null # 명시적
value: ~ # YAML 축약형
value: # 빈 값 = null
{ "value": null }
5. 키의 특수 문자
JSON 키는 모든 유니코드 문자를 포함할 수 있습니다. 특수 문자가 있는 YAML 키는 따옴표가 필요합니다:
"content-type": "application/json" # 하이픈에 따옴표 필요
simple_key: value # 밑줄은 괜찮음
커맨드 라인 변환
yq (YAML 프로세서) 사용
# JSON에서 YAML로
yq -P input.json > output.yaml
# YAML에서 JSON으로
yq -o=json input.yaml > output.json
Python 사용
# JSON에서 YAML로
python3 -c "import json, yaml, sys; print(yaml.dump(json.load(sys.stdin), default_flow_style=False))" < input.json > output.yaml
# YAML에서 JSON으로
python3 -c "import json, yaml, sys; print(json.dumps(yaml.safe_load(sys.stdin), indent=2))" < input.yaml > output.json
jq + yq 함께 사용
# JSON 처리 후 YAML로 출력
cat config.json | jq '.database' | yq -P
각 포맷의 사용 시기
| 기준 | JSON | YAML |
|---|---|---|
| 사람이 편집 | 어려움 (괄호, 쉼표) | 쉬움 (깔끔한 구문) |
| 기계 파싱 | 빠름 | 느림 |
| 주석 | 미지원 | 지원 |
| 데이터 교환 | 표준 (API) | 드물게 사용 |
| 설정 | 허용 | 선호 |
| 엄격성 | 엄격 (좋음) | 유연 (위험) |
JSON 사용 시기: API 통신, 데이터 저장, 기계 생성 설정, 브라우저 환경.
YAML 사용 시기: 사람이 편집하는 설정, Docker Compose, Kubernetes, CI/CD 파이프라인, Ansible.
더 자세한 비교는 YAML vs JSON 글을 참조하세요.
FAQ
YAML은 JSON의 상위 집합인가요?
네, YAML 1.2 (2009) 이후 모든 유효한 JSON 문서는 유효한 YAML이기도 합니다. YAML 파서는 JSON을 직접 파싱할 수 있습니다. 그러나 반대는 성립하지 않습니다 — 주석, 앵커, 멀티라인 문자열 같은 YAML 기능은 JSON에 해당하는 것이 없습니다.
JSON과 YAML 중 어느 것이 파싱이 더 빠른가요?
거의 모든 언어에서 JSON이 훨씬 빠르게 파싱됩니다. JSON 파서는 처리할 구문이 적어 더 단순합니다. 시작 시 한 번 로드하는 설정 파일에서는 차이가 무시할 수 있습니다. 고처리량 데이터 처리에서는 JSON이 확실한 선택입니다.
관련 리소스
- JSON에서 YAML 변환기 — 포맷 간 즉시 변환
- YAML vs JSON — 상세한 포맷 비교
- YAML 구문 튜토리얼 — YAML을 처음부터 배우기