본문 바로가기
Converter

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에서 따옴표를 정확히 쓰는 게 중요합니다.