JSON → CSV 변환기

왼쪽에 객체 배열 형태의 JSON을 붙여넣으면 오른쪽에 적절히 따옴표 처리된 CSV가 만들어져요. 헤더는 객체 키에서 가져오며, 모든 처리는 로컬에서 진행됩니다.

  1. 왼쪽 텍스트 영역에 객체 배열 형태의 JSON을 붙여넣어 주세요.
  2. "CSV로 변환" 버튼을 누르면 모든 객체 키의 합집합으로 헤더 행이 만들어져요.
  3. 결과를 복사하거나 data.csv 파일로 다운로드할 수 있어요.
  4. 중첩된 값은 JSON 문자열로 변환됩니다. 평면 컬럼이 필요하면 변환 전에 미리 펼쳐 주세요.
어떤 도구인가요?

객체 배열 형태의 JSON을 RFC 4180 CSV로 변환합니다. 헤더 행은 모든 객체 키의 합집합이에요. 콤마, 따옴표, 줄 바꿈이 포함된 값은 자동으로 큰따옴표로 감싸집니다. 숫자와 부울은 따옴표 없이 출력되고, null/undefined 는 빈 필드가 돼요. 중첩 객체나 배열은 하나의 따옴표로 감싼 JSON 문자열 필드로 직렬화됩니다 — CSV는 계층 구조를 표현할 수 없기 때문이에요.

예시

JSON 입력:

[
  {"name":"Ada","age":36,"role":"engineer"},
  {"name":"Grace","age":40,"role":"scientist"}
]

CSV 출력:

name,age,role
Ada,36,engineer
Grace,40,scientist

자주 만나는 JSON → CSV 함정

CSV는 평면 형식이에요. 결과가 이상하게 나올 때는 대부분 평면으로 표현하기 어려운 JSON 구조 때문입니다.

  • 최상위가 배열이 아님. `{"a":1,"b":2}` 같은 단일 객체는 CSV로 직접 변환할 수 없어요. 배열로 감싸 주세요: `[{"a":1,"b":2}]`. 그러면 헤더 한 줄과 데이터 한 줄짜리 CSV가 만들어집니다.
  • 행마다 키가 다름. 첫 객체가 `{a,b}`, 두 번째가 `{a,c}` 라면 헤더는 합집합인 `a,b,c` 가 돼요. 키가 빠진 행은 빈 필드를 출력합니다. 엄격한 스키마가 필요하면 변환 전에 일관된 형태로 만들어 주세요.
  • 중첩 값이 조용히 평탄화됨. `{"address":{"city":"NY"}}` 같은 필드는 값이 `{"city":"NY"}` 인 단일 컬럼이 돼요. `address.city` 같은 별도 컬럼이 필요하면 JavaScript에서 먼저 평면화하세요: `{address_city: row.address.city}`.
  • 값에 줄 바꿈이 포함됨. 여러 줄 문자열은 따옴표로 감싼 CSV 필드 안에 `\n` 문자가 그대로 들어가요. 대부분의 스프레드시트는 잘 처리하지만 일부 구형 도구는 그렇지 못할 수 있어요.
  • 헤더에 특수 문자. 콤마, 따옴표, 줄 바꿈이 포함된 JSON 키도 동작은 하지만 일부 CSV 소비자는 헤더를 잘못 파싱할 수 있어요. 호환성이 중요하면 변환 전에 영숫자와 밑줄로 키 이름을 정리하세요.
  • JSON에 마지막 쉼표. `[{"a":1},]` 는 마지막 쉼표 때문에 잘못된 JSON이에요. CSV 변환 단계 이전에 파서가 거부합니다. 필요하면 먼저 `/json-prettifier` 로 정리하세요.
자주 묻는 질문

탭으로 구분된 결과(TSV)는 어떻게 얻나요?

이 페이지는 콤마 구분 CSV를 출력해요. TSV가 필요하면 결과의 `,` 를 `\t` 로 일괄 치환하거나, 명령줄에서 `delimiter: "\t"` 옵션으로 PapaParse를 직접 실행하세요. 같은 라이브러리입니다.

헤더 행의 키 순서는 유지되나요?

네. 모든 객체에서 키가 처음 등장한 순서대로 헤더가 만들어져요. 알파벳 정렬이 필요하면 변환 전에 JSON에서 키를 정렬하세요.

날짜는 어떻게 처리되나요?

JSON에는 네이티브 Date 타입이 없어서 보통 ISO 8601 문자열로 직렬화돼요. 그 문자열이 그대로 CSV에 들어갑니다. JSON.stringify 시점에 이미 변환된 상태이기 때문에 추가 처리는 없어요.

JSON → CSV → JSON 왕복 변환이 가능한가요?

평면 객체 배열이라면 가능해요. 문자열과 숫자는 그대로 보존되고, csv-to-json의 동적 타입 변환을 거치면 다시 같은 타입이 됩니다. 중첩된 값은 CSV 단계에서 구조를 잃기 때문에 다시 JSON 문자열 필드로 돌아오지, 객체로 복원되지는 않아요.

JSON이 어디론가 업로드되나요?

아니요. 모든 처리는 브라우저 안에서 진행돼요. 변환 버튼을 눌러도 네트워크 요청이 발생하지 않는 것을 개발자 도구에서 직접 확인할 수 있어요.

얼마나 큰 JSON까지 변환되나요?

약 50 MB 까지는 무리 없이 동작해요. 변환 자체는 입력 크기에 선형이지만 텍스트 영역 렌더링이 병목이 돼요. 더 큰 파일은 명령줄에서 PapaParse를 직접 사용하는 편이 빠릅니다.