JSON과 YAML: 같은 데이터, 다른 표기
JSON과 YAML은 같은 것을 표현할 수 있습니다. 객체(YAML에서는 매핑), 리스트, 문자열, 숫자, 불리언, null입니다. JSON은 중괄호, 대괄호, 따옴표, 쉼표를 쓰고, YAML은 들여쓰기와 대시를 씁니다. 그래서 YAML이 더 짧고 사람이 직접 읽고 고치기 쉽습니다. Kubernetes, Docker Compose, GitHub Actions, Ansible이 설정에 YAML을 쓰고, API는 주로 JSON으로 주고받는 이유입니다.
둘 사이를 오갈 일은 자주 생깁니다. API가 JSON을 돌려주는데 그 내용을 설정 파일에 넣고 싶을 때, 또는 YAML 설정을 JSON만 읽는 프로그램에 넘겨야 할 때입니다. 이 JSON YAML 변환기는 두 방향을 모두 처리합니다.
사용 방법
- JSON → YAML 또는 YAML → JSON 버튼으로 방향을 고릅니다.
- 왼쪽 입력란에 데이터를 붙여넣거나, 파일 열기 또는 예시를 누릅니다. 입력하는 동안 오른쪽에 결과가 나타납니다.
- 들여쓰기를 공백 2칸이나 4칸으로 고릅니다. YAML을 JSON으로 바꿀 때는 압축 옵션도 있습니다.
- JSON을 YAML로 바꿀 때 키를 알파벳순으로 정렬하려면 키 A-Z 정렬을 켭니다.
- 복사를 누르거나, 다운로드로
.yaml또는.json파일을 저장합니다.
방향을 바꾸면 현재 결과가 입력란으로 옮겨지므로, 왕복 변환해서 결과가 같은지 확인할 수 있습니다.
JSON을 YAML로 바꾼 예시
{"name":"web-app","version":3,"private":true,"ports":[80,443],"database":{"host":"localhost","password":null},"tags":["api","v2"]}
다음과 같이 바뀝니다.
name: web-app
version: 3
private: true
ports:
- 80
- 443
database:
host: localhost
password: null
tags:
- api
- v2
한글 키와 값도 따옴표 없이 그대로 나옵니다. 이 도구로 {"이름":"김민준","도시":"서울","메모":"예: 테스트"}를 변환하면 이름: 김민준, 도시: 서울 다음 줄에 메모: "예: 테스트"가 나옵니다. 값 안에 콜론과 공백이 있으면 아래 설명처럼 따옴표가 붙습니다.
안전한 따옴표 처리
어떤 문자열은 YAML 파서에게 다른 타입처럼 보입니다. 변환기는 이런 값을 따옴표로 감싸 문자열로 유지합니다. 이 JSON은
{"zip":"02134","enabled":"yes","version":"1.10","note":"a: b","empty":""}
다음과 같이 바뀝니다.
zip: "02134"
enabled: "yes"
version: "1.10"
note: "a: b"
empty: ""
따옴표가 없으면 02134는 앞자리 0을 잃고, 1.10은 숫자 1.1이 되며, 오래된 YAML 1.1 파서(PyYAML과 많은 CI 도구가 이 규칙을 따릅니다)는 yes를 true로 읽습니다. 변환기는 더 엄격한 따옴표 규칙을 따르므로 결과가 오래된 파서와 새 파서에서 똑같이 읽힙니다. "2024-01-15" 같은 날짜도 같은 이유로 따옴표가 붙습니다.
YAML을 JSON으로 바꾼 예시
# App settings
name: web-app
ports:
- 80
- 443
debug: false
retries: 3
owner: ~
다음과 같이 바뀝니다.
{
"name": "web-app",
"ports": [
80,
443
],
"debug": false,
"retries": 3,
"owner": null
}
JSON에는 주석이 없으므로 주석은 사라졌고, ~는 YAML에서 null을 줄여 쓴 표기입니다.
병합 키도 풀어 줍니다. 이런 Rails 스타일 파일은
defaults: &defaults
adapter: postgres
host: localhost
development:
<<: *defaults
database: dev_db
다음 결과가 됩니다.
{
"defaults": {
"adapter": "postgres",
"host": "localhost"
},
"development": {
"adapter": "postgres",
"host": "localhost",
"database": "dev_db"
}
}
---로 구분된 두 문서(예: kind: Service와 kind: Deployment)는 배열 하나가 됩니다. 압축 옵션을 고르면 [{"kind":"Service"},{"kind":"Deployment"}]로 나옵니다.
값을 읽는 규칙
YAML을 JSON으로 바꿀 때는 YAML 1.2 규칙을 씁니다. 이 규칙에서 yes, no, on은 일반 문자열이고, 불리언은 true와 false뿐이며, 날짜는 문자열로 남습니다. 이 입력은
a: yes
b: no
c: on
d: true
e: 010
f: 0o10
g: 1e3
h: 2024-01-15
압축하면 다음과 같이 변환됩니다.
{"a":"yes","b":"no","c":"on","d":true,"e":10,"f":8,"g":1000,"h":"2024-01-15"}
010은 10으로 읽히고, 0o10은 8을 뜻하는 8진수라는 점에 주의하세요.
값을 반드시 텍스트로 남겨야 한다면 YAML에서 따옴표로 감싸세요.
깔끔한 왕복 변환을 위한 팁
- JSON을 YAML로 바꿨다가 다시 JSON으로 바꾸면 데이터는 같지만 텍스트까지 항상 같지는 않습니다. 키 A-Z 정렬을 켜지 않으면 키 순서는 유지됩니다.
- YAML의 주석, 앵커, 사용자 정의 태그는 JSON에 대응하는 것이 없습니다. 앵커는 데이터 전체 복사본으로 펼쳐집니다.
- 20자리 ID처럼 아주 큰 정수는 브라우저가 지원하는 경우 JSON을 YAML로 바꿀 때 정확히 유지됩니다. YAML을 JSON으로 바꿀 때는 자바스크립트 숫자를 거치므로 긴 ID는 따옴표로 감싼 문자열로 저장하세요.
- 파일은 기기에 그대로 남습니다. 아무것도 업로드되지 않습니다.
오류
실수가 있으면 줄과 열을 알려 주고, 입력에서 보기를 누르면 그 위치로 이동합니다. JSON에 끝 쉼표가 있으면 3행 1열: "}" 앞에는 후행 쉼표를 쓸 수 없습니다라는 메시지가 나옵니다. YAML에서 키가 중복되면 YAML 라이브러리의 영어 메시지 Map keys must be unique가 나오고, YAML은 공백만 허용하므로 탭으로 들여쓰기한 경우에도 오류가 납니다.
다른 변환 방법
yq. Go 버전 yq는 명령줄에서 변환합니다. JSON도 올바른 YAML이므로 JSON을 입력으로 읽을 수 있고, 두 형식 중 어느 쪽으로든 출력합니다.
Python. PyYAML 패키지를 쓰면 yaml.safe_dump(json.load(f))로 JSON 파일에서 YAML을 만듭니다. PyYAML은 YAML 1.1을 따르므로 yes, no 같은 문자열을 확인하세요. 한글이 \uXXXX로 바뀌지 않게 하려면 allow_unicode=True도 함께 넘기세요.
VS Code. 선택한 부분을 JSON과 YAML 사이에서 바꿔 주는 명령을 추가하는 확장이 여럿 있습니다.
관련 도구
변환 없이 YAML 파일만 정리하려면 YAML 포매터를 쓰세요. JSON을 먼저 검사하거나 정리하려면 JSON 포매터를, 스프레드시트 데이터라면 CSV JSON 변환기부터 시작하세요.