무엇을 하나
- JSON: 공백 2 · 4 · 탭으로 들여쓰거나 한 줄로 줄입니다(Python
json.dumps와 같은 꼴). 숫자는 원문 그대로 두어12345678901234567890같은 큰 정수나1.50의 자릿수를 잃지 않습니다. 문법 오류는 줄 · 열을 Pythonjson과 같은 자리로 알려 줍니다. - YAML → JSON: 문법은 검증된 라이브러리 yaml(ISC)이 읽고, 따옴표 없는 값의 해석은 고른 판의 규칙을 따릅니다 — 1.2 는 스펙의 core 스키마, 1.1 은 PyYAML 과 같은 규칙(병합 키
<<포함). 두 판이 다르게 읽는 값은 표로 보입니다. - JSON → YAML: 어느 판으로 읽어도 글자가 글자로 남도록
"no"·"0777"·"2001-12-14"같은 값은 따옴표로 감쌉니다. 결과는 내보내기 전에 다시 읽어 값이 같은지 확인합니다.
YAML 의 함정
| 따옴표 없는 값 | YAML 1.2 | YAML 1.1(PyYAML) |
|---|---|---|
no · on | 글자 "no" · "on" | false · true |
0777 | 777 | 511(8진수) |
0o17 | 15 | 글자 "0o17" |
2001-12-14 | 글자 | 날짜 — JSON 에는 날짜가 없어 원래 글자로 씀 |
1:20 | 글자 | 80(60진수) |
1_000 | 글자 | 1000 |
1e3 | 1000.0 | 글자 "1e3"(1.1 의 소수는 점이 있어야 함) |
y | 글자 | 글자(PyYAML) — 1.1 스펙 표에는 불리언이라 쓸 때는 감쌈 |
나라 코드 NO(노르웨이)가 false 가 되는 일이 이 표의 첫 줄입니다. 설정 파일을 PyYAML 같은 1.1 파서가 읽는다면 1.1 을 골라 확인합니다.
어떻게 확인했나
공개 전에 244가지를 대조해 모두 맞았습니다: JSON 25개 × (공백 2 · 4 · 한 줄 · 키 정렬) = Python json.dumps(ensure_ascii=False) 100가지(숫자 원문을 지킨 2개와 짝 없는 서로게이트 1개는 값으로 비교), 깨진 JSON 32개의 오류 줄 · 열 = Python json, YAML 35개를 1.1 로 바꾼 결과 = PyYAML 6.0.3 safe_load(오류가 나는 입력은 PyYAML 도 오류이거나 JSON 으로 못 바꾸는 값), 같은 YAML 의 1.2 해석 = yaml 라이브러리 core 스키마 34가지, JSON → YAML 25개를 PyYAML · ruamel.yaml 0.19.1 이 다시 읽은 값 = 원래 값, 위 함정 표 18가지.
흔한 실수
- 끝의 쉼표
[1, 2,]· 작은따옴표{'a': 1}· 주석 — JSON 에서는 모두 오류입니다. - YAML 들여쓰기에 탭 — YAML 은 들여쓰기에 탭을 쓰지 못합니다.
- 큰 ID 를
JSON.parse로 읽기 — 2⁵³ 을 넘는 정수는 반올림됩니다. 문자열로 주고받습니다. - 같은 키를 두 번 쓰기 — JSON 파서는 대개 뒤의 값을 쓰지만 YAML 은 금하고, 오류로 멈추는 파서도 있습니다.
자주 묻는 것
어느 YAML 판을 골라야 하나요?
그 파일을 읽는 프로그램을 따릅니다. Python 의 PyYAML 은 1.1, JavaScript 의 yaml 은 1.2 입니다. 섞인 것도 있습니다 — ruamel.yaml 0.19 는 1.2 가 기본이지만 2001-12-14 를 날짜로, 1_000 을 1000 으로 읽었습니다(공개 전 실측). 다른 라이브러리는 그 문서를 확인합니다. 어느 쪽이 읽을지 모르면 위 함정 표에 나온 값을 따옴표로 감싸 두는 것이 안전합니다.
CloudFormation 의 !Ref 같은 태그는 왜 바꾸지 않나요?
JSON 에는 태그가 없어 어떻게 바꿔도 원래 뜻을 잃습니다. 짐작해서 바꾸는 대신 그 위치를 오류로 알려 줍니다.
붙여 넣은 내용이 서버로 가나요?
아니요. 계산은 모두 브라우저 안에서 하고 입력값은 주소창이나 브라우저 저장소에 쓰지 않습니다. 이 사이트가 쓰는 방문 통계와 광고에도 넘기지 않습니다. 자세한 것은 개인정보 처리 안내에 있습니다.