JSON CSV 변환기·YAML·TSV 변환

JSON↔CSV, JSON↔YAML·TOML, CSV↔TSV 변환

JSON↔CSV, JSON↔YAML·TOML, CSV↔TSV 변환

JSONCSV

모든 변환은 브라우저에서 처리되며 서버로 업로드되지 않습니다. 중첩 객체는 dot notation으로 평탄화·복원되고, 숫자·true/false·null은 자동으로 타입이 추론됩니다.

JSON CSV 변환기·YAML·TSV 변환 소개

이 도구는 표 형식과 설정 파일 형식 사이를 오갑니다. JSON ↔ CSV 탭은 객체 배열을 표로 펴거나 표를 객체 배열로 되돌리고, CSV ↔ TSV 탭은 쉼표 구분과 탭 구분을 바꾸며, JSON ↔ YAML ↔ TOML 탭은 설정 파일 세 형식을 서로 변환합니다. 모두 붙여 넣은 텍스트를 바로 변환하고 결과를 복사하는 방식입니다.

형식 변환에서 문제가 되는 것은 대개 문법이 아니라 「값이 조용히 바뀌는 순간」입니다. 우편번호 앞의 0이 사라지고, 엑셀에서 한글이 깨지고, YAML에서 NO가 false가 됩니다. 아래에서는 각 형식의 규칙과 이 도구가 그런 지점을 어떻게 처리하는지 설명합니다.

CSV의 규칙은 생각보다 적다 (RFC 4180)

CSV를 정의한 문서는 2005년의 RFC 4180인데, 규칙이 몇 줄뿐입니다. 레코드는 줄바꿈(CRLF)으로 나누고, 필드는 쉼표로 나눕니다. 필드 안에 쉼표, 큰따옴표, 줄바꿈이 있으면 필드 전체를 큰따옴표로 감쌉니다. 필드 안의 큰따옴표는 두 번 써서("") 나타냅니다. 이 문서도 스스로 「공식 표준이 아니라 널리 쓰이는 형식을 기록한 것」이라고 밝히고 있어, 프로그램마다 세부 동작이 다릅니다.

이 도구는 CSV를 쓸 때 꼭 필요한 필드만 따옴표로 감싸고 줄은 CRLF로 끝냅니다. 읽을 때는 CRLF와 LF를 모두 받아들이고, 따옴표 안의 줄바꿈도 필드의 일부로 처리합니다. CSV → JSON과 CSV ↔ TSV 탭에서는 따옴표가 닫히지 않았거나 행마다 열 개수가 다르면 경고를 띄웁니다. 구분자는 쉼표·세미콜론·탭 중에서 고를 수 있고, 「자동 감지」로 두면 CSV를 읽을 때 헤더 줄을 보고 알아서 고릅니다. 그래서 세미콜론으로 구분된 유럽식 엑셀 CSV도 그대로 넣으면 됩니다.

엑셀에서 한글이 깨지는 이유: BOM

요즘 웹에서 만드는 CSV는 거의 UTF-8입니다. 그런데 한국어 Windows의 엑셀은 CSV를 더블클릭으로 열 때 파일 앞에 BOM(바이트 순서 표시, EF BB BF)이 없으면 UTF-8로 보지 않고 시스템 기본 인코딩(한국어는 CP949)으로 읽습니다. 그래서 「이름」이 「�씠由�」 같은 글자로 깨집니다. 마이크로소프트 지원 문서도 BOM이 있는 UTF-8 CSV는 정상적으로 열리고, 그렇지 않으면 데이터 탭의 「텍스트/CSV에서」로 가져오면서 파일 원본을 「65001: 유니코드(UTF-8)」로 지정하라고 안내합니다.

JSON → CSV 결과는 「.csv (UTF-8 BOM, 엑셀용)」 버튼으로 받으면 BOM이 붙어 엑셀에서 더블클릭으로 바로 열립니다. 복사한 텍스트나 일반 「다운로드 .csv」에는 BOM이 없으니, 메모장에 붙여 넣어 저장한다면 인코딩을 「BOM 있는 UTF-8」로 고르세요. 반대로 엑셀에서 「CSV UTF-8」로 저장한 파일은 맨 앞에 BOM이 있는데, CSV를 JSON으로 바꿀 때 도구가 이 BOM을 지우므로 첫 열 이름에 보이지 않는 문자가 붙지 않습니다.

JSON ↔ CSV: 중첩, 배열, 값의 타입

CSV는 평평한 표라서 중첩 객체를 그대로 담을 수 없습니다. 도구는 {"addr": {"city": "Seoul"}}을 addr.city라는 열로 펴고, CSV → JSON에서는 점을 기준으로 다시 중첩합니다. 배열은 펴지 않고 ["a","b"] 같은 JSON 문자열로 한 칸에 넣습니다. 객체마다 키가 다르면 모든 키를 모아 열을 만들고, 없는 칸은 비워 둡니다. 키 이름 자체에 점이 들어 있으면 되돌릴 때 중첩으로 바뀌니 주의하세요.

CSV에는 타입이 없습니다. 모든 칸이 문자열이므로 CSV → JSON에서는 도구가 타입을 추측합니다. 숫자처럼 보이면 숫자, 정확히 true/false면 불리언, 빈 칸과 null은 null로 바꿉니다. 단, 04524처럼 0으로 시작하는 숫자는 우편번호나 코드일 가능성이 높아 문자열로 둡니다. 엑셀은 같은 값을 4524로 바꿔 버리는 것으로 유명합니다. 반면 1e3은 지수 표기 숫자로 보고 1000이 되고, 대문자 TRUE는 문자열로 남습니다. 빈 문자열과 null은 CSV에서 구분할 수 없어서, 왕복하면 ""가 null이 됩니다.

CSV ↔ TSV: 탭에는 따옴표 규칙이 없다

TSV(탭 구분 값)는 엑셀이나 구글 시트에서 셀을 복사해 붙여 넣을 때 쓰이는 형식입니다. 쉼표가 들어간 주소나 금액을 따옴표 없이 다룰 수 있어 편하지만, 필드 안의 탭과 줄바꿈을 나타낼 표준 방법이 없습니다. 이 도구는 CSV의 셀 안에 탭이나 줄바꿈이 있으면 TSV에서 \t, \n으로(역슬래시 자체는 \\로) 바꿔 한 줄을 유지하고, TSV → CSV에서 원래 문자로 되돌립니다. 그래서 손으로 쓴 TSV에 \n이라는 두 글자가 있으면 줄바꿈으로 해석된다는 점만 기억하면 됩니다.

YAML: NO가 false가 되던 문제와 1.1 / 1.2

YAML 1.1에서는 yes, no, on, off, y, n 같은 단어도 불리언이었습니다. 그래서 국가 코드 목록에 노르웨이(NO)를 따옴표 없이 쓰면 false가 되는 「노르웨이 문제」가 유명합니다. 2009년의 YAML 1.2는 기본 스키마에서 불리언을 true/false 계열로만 줄이고, 22:30 같은 60진수 표기도 없앴습니다. 하지만 PyYAML 등 널리 쓰이는 라이브러리 일부는 여전히 1.1 규칙을 기본으로 씁니다.

이 도구의 YAML 파서는 1.2 쪽으로 동작합니다. NO와 yes는 문자열로, 22:30도 문자열로 읽습니다. 대신 JSON → YAML로 쓸 때는 "NO", "yes", "on"처럼 1.1 파서가 오해할 수 있는 문자열에 따옴표를 붙여서, 결과 파일을 어떤 파서가 읽어도 문자열로 남게 합니다. 숫자처럼 보이는 문자열("3.10")도 따옴표를 붙입니다.

그 밖에 알아 둘 점이 있습니다. 따옴표 없는 3.10은 숫자라서 3.1이 되고(파이썬 버전 표기를 이렇게 쓰면 흔히 사고가 납니다), 012는 12가 됩니다. 앵커·별칭(&, *), 병합 키(<<), 여러 줄 블록 스칼라(|, >)는 지원하지 않아 오류로 알립니다. TOML은 null이 없어서 JSON의 null은 빈 문자열 ""로 바뀌는 손실 변환입니다.

예시

JSON → CSV: 쉼표·따옴표·중첩·배열

입력
[{"id":1,"name":"Kim, Minjun","addr":{"city":"Seoul","zip":"04524"},"tags":["a","b"],"note":"He said \"hi\""},{"id":2,"name":"Lee","addr":{"city":"Busan"},"note":null}]
결과
id,name,addr.city,addr.zip,tags,note 1,"Kim, Minjun",Seoul,04524,"[""a"",""b""]","He said ""hi""" 2,Lee,Busan,,,

쉼표가 있는 이름과 따옴표가 있는 메모만 감싸고, 안의 따옴표는 두 번 씁니다. 배열은 JSON 문자열로 한 칸에 들어가고, 두 번째 행에 없는 zip·tags와 null인 note는 빈 칸입니다.

CSV → JSON: 타입 추측

입력
id,zip,phone,flag,addr.city 1,04524,010-1234-5678,true,Seoul 2,1e3,,TRUE,Busan
결과
[{"id":1,"zip":"04524","phone":"010-1234-5678","flag":true,"addr":{"city":"Seoul"}}, {"id":2,"zip":1000,"phone":null,"flag":"TRUE","addr":{"city":"Busan"}}]

0으로 시작하는 04524는 문자열로 남지만 1e3은 숫자 1000이 됩니다. 빈 칸은 null, 소문자 true만 불리언입니다. 같은 열의 타입이 행마다 달라질 수 있으니 받는 쪽 코드에서 확인하세요.

YAML → JSON: 1.1이면 달라졌을 값들

입력
country: NO answer: yes version: 3.10 time: 22:30 zip: 012
결과
{"country": "NO", "answer": "yes", "version": 3.1, "time": "22:30", "zip": 12}

YAML 1.1 파서라면 country와 answer는 false/true, time은 60진수 1350이 됐을 값입니다. 이 도구는 문자열로 둡니다. 다만 3.10과 012는 숫자로 읽혀 끝의 0과 앞의 0이 사라지니, 문자열이어야 하면 따옴표를 붙이세요.

JSON → YAML: 오해받을 문자열에 따옴표

입력
{"country":"NO","answer":"yes","v":"3.10","n":null,"s":"a: b"}
결과
country: "NO" answer: "yes" v: "3.10" n: null s: "a: b"

문자열인데 YAML에서 다른 타입이나 구조로 읽힐 수 있는 값만 따옴표로 감쌉니다.

사용 방법

  1. 탭을 고릅니다: JSON ↔ CSV, CSV ↔ TSV, JSON ↔ YAML ↔ TOML.
  2. 변환 방향을 정하고 입력 칸에 붙여 넣습니다.
  3. 경고(닫히지 않은 따옴표, 열 개수 불일치, 지원하지 않는 YAML 문법)를 확인한 뒤 결과를 복사합니다.

자주 묻는 질문

CSV를 엑셀로 열면 한글이 깨져요.

UTF-8 파일에 BOM이 없어서 엑셀이 CP949로 읽은 경우입니다. 이 도구에서는 「.csv (UTF-8 BOM, 엑셀용)」으로 내려받으면 됩니다. 이미 있는 파일은 「BOM 있는 UTF-8」로 다시 저장하거나, 엑셀의 데이터 → 텍스트/CSV에서 가져오기로 열면서 65001(UTF-8)을 고르세요.

우편번호 앞의 0이 없어져요.

이 도구는 0으로 시작하는 숫자를 문자열로 유지합니다. 0이 사라지는 것은 대개 엑셀에서 열 때입니다. 가져오기 단계에서 해당 열을 텍스트 형식으로 지정하세요.

중첩된 JSON도 CSV로 바꿀 수 있나요?

객체는 addr.city처럼 점 표기 열로 펴집니다. 배열은 펴지 않고 JSON 문자열로 한 칸에 들어갑니다.

YAML의 yes/no는 true/false인가요?

YAML 1.1에서는 그렇고, 1.2에서는 문자열입니다. 이 도구는 1.2처럼 읽고, 쓸 때는 두 버전 모두 문자열로 읽도록 따옴표를 붙입니다.

YAML 앵커(&, *)가 있는 파일은요?

지원하지 않아 오류로 알립니다. 별칭을 풀어 쓴 파일로 변환하세요.

출처

기준일:

개인정보와 저장 방식