작성 김지광 (운영자)마지막 업데이트 bal.pe.kr

JSON ↔ CSV 변환 가이드

업데이트 2026-07-11 · 아래 모든 변환은 브라우저 안에서만 수행됩니다(업로드 없음).

1. 이 도구가 하는 일

이 도구는 JSON을 CSV로, 그리고 CSV를 다시 JSON으로 브라우저 안에서만 변환합니다. JSON→CSV의 핵심 난점은 JSON은 트리(객체 안 객체, 객체 안 배열)인 반면 CSV는 행·열로 이루어진 평면 표라는 점입니다. 이 도구는 중첩 구조를 dot-notation 컬럼으로 평탄화하고, 배열을 어떻게 펼칠지 고를 수 있게 해서 둘을 연결합니다.

2. 지원하는 JSON 형태

  • 객체 배열 — 가장 흔한 형태. 각 객체가 한 행이 됩니다.
  • 단일 객체 — 1행짜리 표가 됩니다.
  • 원시값 배열[1, 2, 3]value라는 단일 컬럼이 됩니다.
  • 깊은 중첩 — 임의 깊이의 객체·배열을 옵션에 따라 처리합니다.

컬럼은 모든 행의 키를 합집합으로 모아 최초 등장 순서대로 만듭니다. 어떤 행에 키가 없으면 그 셀은 빈 칸이 됩니다.

3. 중첩 객체 평탄화 (dot notation)

중첩 객체 평탄화를 켜면 중첩 키 경로를 점(.)으로 이어 컬럼명으로 씁니다.

{ "id": 1, "address": { "city": "Seoul", "zip": "100" } }

→  id,address.city,address.zip
   1,Seoul,100

깊이에 제한이 없어 a.b.c.d도 동작합니다. 평탄화를 끄면 최상위 키만 컬럼이 되고, 중첩 객체·배열은 한 셀 안에 압축된 JSON 문자열로 들어갑니다.

4. 배열 처리

배열은 또 다른 중첩 요소입니다. 펼치는 방식을 선택할 수 있습니다.

방식{ tags: ["a","b"] } 결과
인덱스 컬럼tags.0=a, tags.1=b 컬럼
결합(join)단일 tags=a; b
JSON 문자열단일 tags=["a","b"]
폭발(explode)두 행, tags=a / tags=b

폭발(explode)은 API 응답을 표로 풀 때 가장 유용한 차별 기능입니다. 배열 원소마다 한 행을 만들고 나머지 필드는 반복합니다. 한 레코드에 배열 필드가 여러 개면 카티션 곱이 되므로 큰 배열에서는 행 수 증가에 유의하세요.

5. 구분자·헤더·BOM

  • 구분자 — 쉼표(,), 세미콜론(;), 탭. 소수점으로 쉼표를 쓰는 지역에서는 세미콜론이, TSV가 필요하면 탭이 유용합니다.
  • 헤더 행 — 컬럼명 첫 행을 포함하거나 뺍니다.
  • UTF-8 BOM — 바이트 순서 표식을 붙여 Windows Excel이 한글·이모지·악센트 등 비ASCII 문자를 올바른 인코딩으로 열게 합니다. 구글시트·대부분의 파서는 둘 다 인식합니다.

6. 이스케이프 — RFC 4180

이 도구는 사실상 CSV 표준인 RFC 4180을 따릅니다. 값에 구분자·큰따옴표·개행이 들어 있으면 큰따옴표로 감싸고, 값 안의 큰따옴표는 두 개로 이스케이프합니다.

값:   she said "hi", ok
csv:  "she said ""hi"", ok"

덕분에 셀 안에 쉼표나 여러 줄 텍스트를 안전하게 담을 수 있습니다. 기본 줄바꿈은 표준에 따라 \r\n입니다.

7. CSV → JSON

방향을 바꾸면 CSV를 다시 JSON 객체 배열로 파싱합니다.

  • 구분자 자동 감지 — 첫 줄에서 , ; 탭 중 가장 많이 쓰인 것을 고릅니다.
  • 헤더 행 — 첫 행을 키로 씁니다. 끄면 field1, field2… 가 됩니다.
  • 타입 추론"123"→숫자, "true"/"false"→boolean, "null"→null. ID 손상을 막기 위해 값이 정확히 왕복될 때만 숫자로 바꾸므로 007·010-1234는 문자열로 유지됩니다.
  • 언플래튼 — dot 헤더를 중첩 객체로 복원하고 숫자 세그먼트는 배열로 만듭니다: address.city{ address: { city } }, tags.0{ tags: [ ... ] }.

평탄화와 언플래튼은 서로 역연산이므로, 중첩 JSON → CSV → JSON 왕복은 원래 구조를 복원합니다(타입 추론을 켜면 숫자 문자열은 숫자로 돌아옵니다).

8. 프라이버시와 한계

서버가 없습니다. 데이터는 JavaScript로 로컬에서 파싱·직렬화되며 업로드되지 않습니다. 페이지를 한 번 열면 오프라인에서도 동작합니다. 모든 처리가 메모리에서 이뤄지므로 수백 MB급 초대용량 입력은 느리거나 브라우저 한계에 걸릴 수 있고, 여러 큰 배열에 explode를 걸면 행 수가 빠르게 늘 수 있습니다.