JSON YAML 변환기
JSON을 YAML로, YAML을 JSON으로 양방향 변환
같은 데이터, 다른 표기
YAML과 JSON은 담는 것이 같습니다. 객체·배열·문자열·숫자·불리언·null — 이 데이터 모델은 JSON이든 YAML이든 똑같습니다. 다른 것은 그걸 화면에 적는 방식뿐입니다.
# JSON — 괄호·따옴표로 명시, 엄격
{"name": "app", "ports": [80, 443], "tls": true}
# YAML — 들여쓰기로 구조, 따옴표 생략, 주석 가능
name: app
ports:
- 80
- 443
tls: true그래서 쓰임이 갈립니다. JSON은 기계가 주고받기 좋아 API 응답·데이터 교환에, YAML은 사람이 읽고 고치기 좋아 설정 파일(도커 컴포즈·쿠버네티스·GitHub Actions)에 주로 씁니다. 재미있는 사실 하나: 모든 JSON은 유효한 YAML입니다. YAML이 JSON을 포함하는 상위집합이라, 위의 JSON을 그대로 YAML 파서에 넣어도 읽힙니다.
이 변환기는 일부러 전부 변환하지 않는다
보통의 변환기는 “최대한 읽어 내는” 것을 목표로 합니다. 이 변환기는 반대로, 확실히 옳게 변환할 수 있는 것만 변환하고 나머지는 에러를 냅니다. 이유가 있습니다.
YAML은 겉보기보다 훨씬 복잡한 규격입니다. 앵커(&)와 별칭(*)으로 같은 값을 재사용하고, 태그(!!)로 타입을 강제하고, 블록 스칼라(| >)로 여러 줄 문자열을 담습니다. 이런 기능을 손으로 정확히 JSON에 옮기는 것은 까다롭고, 대충 옮기면 그럴듯하지만 틀린 JSON이 나옵니다. 데이터 변환에서 조용히 틀린 답은 못 읽는 것보다 나쁩니다 — 틀린 줄 모르고 쓰기 때문입니다.
그래서 이 변환기는 일상적으로 쓰는 YAML(블록 매핑·시퀀스, - key: 형태의 객체 배열, 플로우 […]·{…}, 따옴표·평문 스칼라, 주석)은 정확히 변환하고, 그 범위를 벗어나는 구문을 만나면 “몇 번째 줄의 무엇이 지원 밖”인지 알려 주고 멈춥니다. 이건 이 사이트의 다른 도구들과 같은 원칙입니다 — CSV 파서도 따옴표를 못 읽으면 추측하지 않고 에러를 냅니다.
YAML의 유명한 함정들
노르웨이 문제: no가 false가 된다
옛 YAML 1.1 규격은 yes/no/on/off를 불리언으로 해석했습니다. 그 결과 국가 목록에 - NO(노르웨이)를 넣으면 false가 되는 유명한 사고가 있었습니다. 이 변환기는 최신 YAML 1.2 core 규칙을 따라 true/false/null과 숫자만 특별 취급하고, yes·no·on·off는 문자열 그대로 둡니다. 불리언이 필요하면 명시적으로 true/false를 쓰세요.
탭은 금지
YAML은 들여쓰기로 구조를 나타내므로 들여쓰기가 곧 문법입니다. 그리고 규격이 탭을 금지합니다 — 반드시 스페이스여야 합니다. 눈에 안 보이는 탭 하나가 구조를 무너뜨리는 게 “YAML이 이유 없이 깨진다”의 흔한 원인입니다. 이 변환기는 탭 들여쓰기를 에러로 잡아 줍니다.
숫자로 오해되는 문자열
007, 버전 1.20, 우편번호처럼 앞자리 0이나 형식이 중요한 값은 따옴표 없이 두면 숫자로 뭉개집니다(007 → 7, 1.20 → 1.2). 이 변환기는 JSON → YAML 방향에서 이런 값을 자동으로 따옴표로 감싸 지켜 줍니다. 반대 방향에서는 원본 YAML의 따옴표를 존중하므로, 문자열로 남겨야 할 값에는 따옴표를 꼭 쓰세요.
자주 묻는 질문
- YAML과 JSON은 무엇이 다른가요?
- 담는 데이터(객체·배열·문자열·숫자·불리언·null)는 똑같고, 적는 방식이 다릅니다. JSON은 중괄호와 따옴표로 구조를 명시해 기계가 읽기 좋고 엄격합니다. YAML은 들여쓰기로 구조를 나타내고 따옴표를 대개 생략해 사람이 읽고 쓰기 좋으며, 주석(#)을 달 수 있습니다. 그래서 API 응답·데이터 교환은 JSON, 설정 파일(도커·쿠버네티스·CI)은 YAML을 주로 씁니다. 실제로 모든 JSON은 유효한 YAML이기도 합니다 — YAML이 JSON의 상위집합이기 때문입니다.
- 왜 어떤 YAML은 변환이 안 되고 에러가 나나요?
- 이 변환기가 일부러 '흔히 쓰는 YAML'만 정확히 파싱하고, 나머지는 추측하는 대신 에러를 내기 때문입니다. YAML에는 앵커(&)·별칭(*)·태그(!!)·여러 줄 블록 스칼라(| >)처럼 손으로 정확히 옮기기 까다로운 기능이 있습니다. 이런 걸 대충 변환하면 그럴듯하지만 틀린 JSON이 나오는데, 데이터에서 조용히 틀린 답은 못 읽는 것보다 나쁩니다. 그래서 지원 범위를 벗어나면 '몇 번째 줄의 무엇이 문제'인지 알려 주고 멈춥니다. 블록 매핑·시퀀스·플로우·따옴표 문자열 같은 일상적인 YAML은 정상 변환됩니다.
- yes/no, on/off가 true/false로 바뀌지 않나요?
- 이 변환기에서는 바뀌지 않습니다 — yes·no·on·off는 문자열로 그대로 둡니다. 이건 의도된 것입니다. 옛 YAML 1.1 규격은 no를 false로, on을 true로 해석했는데(이른바 '노르웨이 문제' — 국가코드 NO가 false가 되는 사고), 이 때문에 수많은 버그가 났습니다. 이 변환기는 최신 YAML 1.2 core 규칙을 따라 true/false/null과 숫자만 특별하게 해석하고 나머지는 문자열로 둡니다. 불리언을 원하면 명시적으로 true 또는 false라고 쓰세요.
- YAML에서 탭(Tab)으로 들여쓰면 안 되나요?
- 안 됩니다. YAML 규격 자체가 들여쓰기에 탭을 금지합니다 — 반드시 스페이스를 써야 합니다. 탭은 편집기마다 너비가 달라 구조가 어긋날 수 있기 때문입니다. 이 변환기도 탭 들여쓰기를 만나면 에러를 냅니다. 'YAML이 이유 없이 깨진다'의 상당수가 눈에 안 보이는 탭 때문이니, 편집기에서 탭을 스페이스로 바꾸는 설정을 켜 두는 게 좋습니다.
- 주석은 어떻게 되나요?
- JSON으로 변환하면 주석은 사라집니다. JSON 규격에는 주석이 없기 때문입니다(그래서 JSON 설정 파일에 주석을 못 달아 불편한 것입니다). YAML → JSON 방향에서는 # 뒤의 주석을 읽고 버립니다. 반대로 JSON → YAML은 원본에 주석이 없으니 붙일 것도 없습니다. 주석까지 보존해야 한다면 변환하지 말고 원본 YAML을 유지하세요.
- 숫자처럼 생긴 문자열(007, 전화번호)은 어떻게 되나요?
- JSON → YAML에서는 따옴표로 감싸 문자열임을 지킵니다. 007은 그냥 두면 YAML이 숫자 7로 해석하므로 "007"로 내보냅니다. 버전 번호(1.2.3)나 앞자리 0이 중요한 값(우편번호·전화번호)이 숫자로 뭉개지지 않게 하려는 것입니다. 반대로 YAML → JSON에서는 따옴표가 있으면 문자열로, 없으면서 숫자 모양이면 숫자로 해석합니다 — 그래서 원본 YAML에서 따옴표를 정확히 쓰는 게 중요합니다.