본문으로 바로가기

JSON YAML 변환기

JSON과 YAML을 서로 변환합니다. 오류는 행·열 위치까지 짚어 주고, yes·no 같은 값도 YAML 1.2 기준으로 처리합니다. 입력은 브라우저 밖으로 나가지 않습니다.

0자 · 0줄
들여쓰기

YAML 1.2로 씁니다. YAML 1.1 파서가 다르게 읽을 수 있는 문자열(yes·no·on·off, 날짜 등)은 따옴표로 감쌉니다. YAML 1.2.2 명세 (새 탭)

0자 · 0줄

입력한 내용은 이 브라우저 안에서만 처리되며 서버로 전송되지 않습니다. 어떻게 동작하나요?

a와 b 값을 유지하면서 JSON 객체와 YAML 매핑을 양방향 변환

사용 방법

위쪽 탭에서 변환 방향(JSON → YAML 또는 YAML → JSON)을 고르고 입력창에 붙여넣으면 결과가 표시됩니다. JSON → YAML에서는 들여쓰기(공백 2칸·4칸)와 키 정렬을, YAML → JSON에서는 들여쓰기(공백 2칸·4칸·탭)와 여러 문서를 배열로 묶을지를 고를 수 있습니다. 결과는 복사하거나 .yaml·.json 파일로 내려받을 수 있습니다. ’파일 열기’로 .json·.yaml·.yml 파일을 불러오면 확장자에 맞춰 변환 방향이 정해집니다. 방향을 바꾸면 방금 만든 결과가 입력창으로 옮겨져 되돌려 변환해 볼 수 있습니다. 입력이 올바르지 않으면 결과 대신 몇 행 몇 열에서 문제가 생겼는지와 그 주변 코드를 보여 줍니다.

처음 변환할 때 yaml 라이브러리를 내려받습니다.

JSON과 YAML의 관계

두 형식 모두 객체(매핑)·배열(시퀀스)·문자열·숫자·불리언·null로 데이터를 나타냅니다. JSON은 중괄호·대괄호·큰따옴표로 구조를 표시하고, YAML은 주로 들여쓰기와 -·:로 표시해 사람이 읽고 고치기 쉽습니다. 2009년에 나온 YAML 1.2는 YAML을 JSON의 엄격한 상위 집합으로 만드는 것을 주된 목표로 삼았습니다. 그래서 올바른 JSON은 거의 언제나 YAML로도 읽히고, YAML → JSON 모드에 JSON을 넣어도 변환됩니다. 반대 방향은 성립하지 않습니다. 주석·앵커·여러 문서처럼 JSON에 없는 기능은 JSON으로 옮길 때 사라지거나 펼쳐집니다.

변환할 때 달라지는 것

  • 주석: JSON 문법(RFC 8259)에는 주석을 적을 자리가 없어서 YAML → JSON 변환에서 모두 빠집니다. YAML 명세도 주석은 표현 방식일 뿐 데이터에 영향을 주지 않는다고 정합니다. 설명을 남겨야 한다면 변환하기 전에 _comment: "staging port"처럼 키와 문자열 값으로 적어 두세요. 결과에는 "_comment": "staging port"로 들어갑니다. #이 있다고 모두 주석인 것은 아닙니다. http://a.com/#frag처럼 앞에 공백이 없는 #과 따옴표 안의 #은 값의 일부로 남습니다. 주석만 있는 입력은 ’변환할 YAML 문서가 없습니다. 주석만 있는지 확인하세요.’라는 오류가 납니다.
  • 앵커·별칭(&name, *name): 가리키는 값을 복사해 펼칩니다. 별칭이 기하급수로 늘어나는 이른바 ‘10억 번 웃음(billion laughs)’ 공격을 막으려고, 별칭이 지나치게 많이 펼쳐지면 변환을 멈춥니다(yaml 라이브러리의 기본 한도 maxAliasCount 100). 공격이 아닌 정상 파일도 한 앵커를 별칭으로 100번 가리키면 같은 오류로 멈춥니다(99번까지는 변환되고, 값의 크기는 상관없으며, << 병합도 한 번으로 셉니다). 별칭이 든 값을 다시 별칭으로 가리키면 횟수가 곱해져 더 일찍 멈춥니다. 그럴 때는 그 앵커를 가리키는 별칭 일부를 실제 값으로 바꾸세요.
  • 병합 키(<<): YAML 1.2 스키마에는 없지만 docker compose 같은 설정 파일이 널리 쓰므로 YAML 1.1 병합 규칙대로 펼칩니다.
  • 여러 문서(---): YAML → JSON에서 ’여러 문서(—)를 배열로 묶기’가 켜져 있으면(기본값) 문서마다 요소 하나씩인 JSON 배열로 바꾸고, 결과 쪽에 ’문서 3개’처럼 문서 수를 보여 줍니다. 끄면 첫 문서만 바꾸고, 나머지 문서 수를 경고로 알려 줍니다. 문서가 하나뿐이면 이 옵션과 상관없이 배열로 감싸지 않습니다. 파일 끝에 내용 없이 ---만 남아 있으면 빈 문서로 세어 배열 끝에 null이 하나 붙으니, 필요 없으면 그 줄을 지우세요. JSON → YAML은 최상위가 배열이어도 --- 문서로 나누지 않고 언제나 문서 하나로 씁니다.
  • 키 순서: YAML과 JSON 모두 명세상 객체의 키에는 순서가 없지만, 이 도구는 입력 순서를 그대로 지킵니다("2"처럼 숫자 모양의 키도 앞으로 옮기지 않습니다). JSON → YAML에서 ’키 정렬’을 켜면 모든 객체의 키를 유니코드 코드 유닛 순서로 정렬합니다.
  • 태그: !Ref처럼 이 도구가 모르는 태그는 떼어 내고 값만 옮기며 경고를 보여 줍니다. 이때 태그가 붙은 값은 3·true처럼 적어도 문자열이 되고, 태그가 붙은 배열·객체는 구조와 안의 값을 그대로 옮깁니다.
  • JSON에 없는 값: .inf·.nan은 JSON에 없어서 null로 바꾸고 경고합니다. 배열이나 객체를 키로 쓴 YAML은 그 키를 JSON 글자로 바꿉니다.
  • 중복 키: YAML에서 한 매핑에 같은 키가 두 번 나오면 명세 위반이라 오류로 알립니다. JSON에서 같은 키가 두 번 나오면 브라우저의 JSON.parse처럼 마지막 값만 남기고 경고합니다.

노르웨이 문제: yes·no·on·off

YAML 1.1에서는 y·yes·on·n·no·off(대소문자 변형 포함)까지 불리언으로 읽었습니다. 그래서 나라 코드 목록에 노르웨이 NO를 따옴표 없이 적으면 false로 바뀌는 일이 생겼고, 이를 흔히 ’노르웨이 문제’라고 부릅니다. YAML 1.2 코어 스키마는 불리언을 true·false(와 True·TRUE처럼 대문자로 쓴 형태)로 좁혔고, 이 도구도 이 기준으로 읽기 때문에 NO·yes·off는 문자열로 남습니다. YAML 1.1 방식으로 읽는 옵션은 없으니, 불리언으로 받아야 하는 값은 YAML에서 true나 false로 고쳐 적으세요. tRue처럼 대소문자를 섞어 쓴 값은 문자열이고, "true"처럼 따옴표로 감싼 값도 문자열입니다.

하지만 아직 YAML 1.1 규칙으로 읽는 도구도 있습니다. 그래서 JSON → YAML 결과에서는 1.1 파서가 다른 값으로 읽을 수 있는 문자열에 큰따옴표를 붙입니다. 불리언 모양의 값(yes·no·on·off·y·n 등), 날짜 모양(2026-09-28), 60진수 모양(1:20), 밑줄이 든 숫자 모양(1_000), 병합 키 <<가 여기에 해당합니다. 따옴표로 감싼 값은 1.1과 1.2 어느 쪽에서도 문자열입니다.

큰 정수와 숫자 정밀도

자바스크립트의 숫자는 IEEE 754 배정밀도라 2^53 - 1(9007199254740991, 16자리)을 넘는 정수는 끝자리가 바뀔 수 있습니다. 이 도구는 두 방향 모두 정수를 BigInt로 다뤄 64비트 ID 같은 큰 정수도 자릿수 그대로 옮깁니다. JSON → YAML에서는 1.0 같은 끝자리 0도 입력대로 둡니다. YAML → JSON에서는 1.0이 1이 됩니다.

YAML → JSON에서는 따옴표 없이 적은 01234가 정수로 읽혀 1234가 되고, 마찬가지로 1.10은 1.1, 0x1F는 31, 0o14는 12가 됩니다. 우편번호·버전·코드처럼 적은 그대로 남아야 하는 값은 YAML에서 "01234"처럼 따옴표로 감싸세요. 그러면 JSON에서도 문자열로 나옵니다. JSON → YAML은 "01234"나 "12345678901234567890" 같은 숫자 모양 문자열에 따옴표를 붙여 쓰므로, 다시 읽어도 문자열입니다.

소수는 두 방향 모두 배정밀도 숫자로 다루므로, 0.1234567890123456789처럼 유효숫자가 많은 소수는 어느 방향에서나 가장 가까운 배정밀도 값으로 반올림됩니다. 지수 표기로 쓴 숫자는 모양이 바뀝니다. JSON → YAML에서는 1e3이 1e+3으로, YAML → JSON에서는 1e3이 1000으로 나옵니다. 배정밀도 범위를 넘는 1e400 같은 값은 JSON → YAML에서 .inf가 됩니다. 결과 JSON을 받는 프로그램이 큰 정수를 일반 숫자로 읽으면 그쪽에서 정밀도를 잃을 수 있으니, 정확한 값이 중요하면 원본에서 문자열로 두는 편이 안전합니다.

이런 때 씁니다

  • Kubernetes 매니페스트: 관례상 YAML로 쓰지만 JSON도 받으며, kubectl은 API로 보낼 때 매니페스트를 JSON 등으로 바꿉니다. API 응답(JSON)을 매니페스트(YAML)로 옮기거나 그 반대로 볼 때 씁니다.
  • GitHub Actions 워크플로: .github/workflows 폴더의 .yml·.yaml 파일로, YAML 문법을 씁니다. 스크립트가 만든 JSON 설정을 워크플로에 옮길 때 편합니다.
  • docker compose: 기본 파일 이름이 compose.yaml이고, 앵커·별칭과 병합 키(<<)로 서비스 설정을 재사용합니다. YAML → JSON으로 바꾸면 병합이 펼쳐진 최종 값을 한눈에 볼 수 있습니다.

참고 자료

자주 묻는 질문

끝에 쉼표가 남았거나 작은따옴표를 쓴 JSON은 JSON → YAML에서 오류가 납니다. 변환할 방법이 있나요?

YAML → JSON에 넣으면 후행 쉼표·작은따옴표·따옴표 없는 키를 YAML 문법으로 읽을 수 있습니다. 예를 들어 {'a': 'x', 'b': [1, 2,],}는 {"a": "x", "b": [1, 2]}가 되고, 방향을 바꾸면 YAML로 옮길 수 있습니다. 다만 //·/* */ 주석은 먼저 지우세요. YAML 주석이 아니어서 오류나 잘못된 키가 생길 수 있습니다. NaN·undefined는 숫자나 특수값이 아닌 문자열로 읽힙니다.

JSON → YAML 결과에 |-나 | 같은 기호가 붙습니다. 잘못 변환된 건가요?

아닙니다. 줄바꿈이 든 문자열을 YAML의 블록 표기로 쓴 것입니다. {"msg": "line1\nline2"}를 넣으면 msg: |- 아래에 line1과 line2가 한 줄씩 들여쓰여 나옵니다. |는 줄바꿈을 그대로 둔다는 표시이고, 뒤에 붙은 -는 문자열 끝에 줄바꿈이 없다는 뜻입니다. "line1\nline2\n"처럼 줄바꿈으로 끝나는 문자열은 -가 없는 |로 씁니다. 이 결과를 YAML → JSON으로 다시 바꾸면 처음의 "line1\nline2"가 그대로 나옵니다. 직접 쓰는 YAML에서 | 대신 >를 쓰면 결과가 달라집니다. msg: > 아래에 line1과 line2를 두 줄로 적으면 줄바꿈이 공백으로 이어져 "line1 line2\n"이 됩니다. 기호 없이 값을 두 줄에 걸쳐 적어도 같은 식으로 이어져 "line1 line2"가 됩니다.

YAML에서 값을 비워 둔 키는 JSON에서 어떻게 나오나요?

null이 됩니다. port:처럼 콜론 뒤를 비워 두면 "port": null로 나오고, null, Null, NULL이나 물결표 ~ 하나만 적은 값도 모두 null입니다. 빈 문자열이 필요하면 port: ""처럼 따옴표 두 개를 적으세요. 그러면 "port": ""가 됩니다. nil과 None은 null이 아니라 문자열 "nil", "None"으로 나옵니다. JSON → YAML에서는 null을 null로, 빈 문자열을 ""로 씁니다. "null"이나 물결표 ~ 하나로 된 문자열에는 따옴표를 붙여 쓰므로 그 YAML을 다시 읽어도 null로 바뀌지 않습니다. 빈 객체와 빈 배열은 {}와 []로 나옵니다.

얼마나 큰 입력까지 변환할 수 있나요?

두 방향 모두 입력은 UTF-8 기준 10MB까지이며, 붙여넣기와 파일 열기에 같은 한도가 적용됩니다. 한글 350만 자는 10,500,000바이트라 한도를 넘습니다. 한도는 결과 크기가 아닌 입력 크기에 적용되므로 더 큰 데이터는 나누어 변환하세요.

탭으로 들여쓴 YAML을 넣으면 오류가 납니다. 어떻게 해야 하나요?

YAML은 들여쓰기에 탭 문자를 허용하지 않습니다. 그래서 줄 앞에 탭이 있으면 'YAML은 들여쓰기에 탭을 쓸 수 없습니다. 공백으로 바꾸세요.'라는 오류와 함께 탭이 있는 행과 열을 알려 줍니다. 그 줄 앞의 탭을 공백으로 바꾸면 변환됩니다. key:와 값 사이에 넣은 탭이나 따옴표 안의 탭은 문제가 되지 않습니다. '들여쓰기'의 '탭'은 YAML → JSON이 내놓는 JSON을 탭으로 들여쓰는 설정이라, 붙여넣는 YAML과는 상관이 없습니다. JSON은 탭으로 들여써도 되므로 JSON → YAML은 그런 입력도 평소처럼 변환하고, 결과 YAML은 공백 2칸이나 4칸으로 들여씁니다.

사용한 오픈소스: yaml (ISC)

최종 수정일: