← 블로그 목록
윈도우작성 · 8분 읽기

JSON CSV 변환 방법 — 윈도우에서 설치 없이 (PowerShell·파이썬·엑셀, 한글 깨짐과 사라지는 0까지)

API 응답이나 내보내기 파일로 받은 JSON 을 엑셀에서 보려고 CSV 로 바꾸는 경우가 많습니다. 검색 결과는 대부분 변환 사이트지만, 윈도우에 기본으로 있는 PowerShell 이나 파이썬 표준 모듈로도 PC 안에서 끝납니다. 다만 그대로 따라 하면 열 이름이 Count·Length 로 나오거나, 한글이 ??? 가 되거나, 주소 칸에 @{city=서울; …} 가 찍히거나, 엑셀에서 0 이 사라집니다. 가짜 회원 3명짜리 JSON 으로 이 함정을 하나씩 재현하고 고친 결과입니다.

JSON 포매터 — 실제 실행 화면
실제 실행 화면
이 글에서 소개하는 무료 도구
JSON 포매터

변환하기 전에 JSON 이 깨지지 않았는지 볼 때 씁니다. 붙여넣으면 정렬해 주고, 틀린 곳이 있으면 줄·칸 위치를 짚어 줍니다. 브라우저 안에서만 처리해 데이터가 밖으로 나가지 않습니다.

  • ✓ 무료
  • ✓ 설치·회원가입 없음
  • ✓ 브라우저에서 바로 실행
  • ✓ 파일이 서버로 올라가지 않음

🔒 파일을 서버나 다른 어떤 곳으로도 보내지 않습니다 — 내 컴퓨터의 브라우저 안에서만 처리합니다.

이동할 주소 — 지금 보고 있는 이 사이트(coding-now.com) 안의 페이지입니다
🔒 https://www.coding-now.com/json-formatter

JSON 과 CSV 는 어디가 안 맞나

CSV 는 첫 줄의 열 이름 아래로 값이 칸칸이 늘어선 평평한 표입니다. 모든 줄이 같은 열을 가집니다. JSON 은 값 안에 또 객체나 배열을 넣을 수 있고, 항목마다 키가 달라도 됩니다. 그래서 JSON 을 CSV 로 바꾼다는 건 두 가지를 정하는 일입니다 — 안에 묶인 값을 어떤 칸으로 펼칠지, 항목마다 다른 키를 어떤 열로 모을지.

이 글의 시험 파일은 가짜 회원 3명입니다. 한글 이름, 앞이 0 인 전화번호(01012345678)와 우편번호(04524), 가입일 글자, 쉼표·따옴표·줄바꿈이 든 메모, 안쪽 객체 주소(city·district), 배열 태그를 넣었고, email 은 둘째 사람에게만, 16자리 order_no 는 셋째 사람에게만 있습니다. API 응답처럼 UTF-8(BOM 없음)으로 저장했습니다(926바이트).

json
[
  {
    "id": 1,
    "name": "김민준",
    "phone": "01012345678",
    "zip": "04524",
    "joined": "2026-10-19",
    "score": 88.5,
    "memo": "첫 주문, \"VIP\"",
    "address": { "city": "서울", "district": "중구" },
    "tags": ["신규", "쿠폰"]
  },
  { "id": 2, "name": "Lee, Seoyeon", "email": "lee@example.com", "…": "…" },
  { "id": 3, "name": "박지호", "order_no": "2026101900000123", "…": "…" }
]

시험 환경은 윈도우 11, 윈도우 PowerShell 5.1.26100, 파이썬 3.11.9, 엑셀 16.0(빌드 20430)입니다. 변환은 전부 PC 안에서 했고 파일을 어디에도 올리지 않았습니다.

방법 1: PowerShell — 윈도우에 이미 있는 것으로

시작 메뉴에서 Windows PowerShell 을 엽니다(관리자 권한 필요 없음). 먼저 JSON 에 어떤 키가 있는지 전부 봅니다. 첫 항목만 보고 열을 정하면 뒤 항목에만 있는 키를 놓칩니다.

1단계: 모든 항목의 키 목록 보기

powershell
$src = "C:\Users\내이름\Downloads\data.json"   # 바꿀 JSON 파일(전체 경로)
$rows = Get-Content $src -Raw -Encoding UTF8 | ConvertFrom-Json
($rows | ForEach-Object { $_.PSObject.Properties.Name } | Select-Object -Unique) -join ','

시험 파일에선 id,name,phone,zip,joined,score,memo,address,tags,email,order_no 11개가 나왔습니다. 첫 항목에는 이 중 9개뿐입니다.

2단계: 열을 정해 CSV 로 저장

powershell
$src = "C:\Users\내이름\Downloads\data.json"   # 바꿀 JSON 파일(전체 경로)
$out = "C:\Users\내이름\Downloads\data.csv"    # 만들 CSV 파일(전체 경로)

$rows = Get-Content $src -Raw -Encoding UTF8 | ConvertFrom-Json
$rows | Select-Object id, name, phone, zip, joined, score, memo,
  @{ n = 'city';     e = { $_.address.city } },       # 안쪽 객체에서 꺼냄
  @{ n = 'district'; e = { $_.address.district } },
  @{ n = 'tags';     e = { $_.tags -join ';' } },      # 배열은 ; 로 이어 붙임
  email, order_no |                                    # 첫 항목에 없는 키도 적어 준다
  Export-Csv $out -NoTypeInformation -Encoding UTF8
  1. 1$src·$out 경로를 내 파일로 바꿉니다. 전체 경로를 쓰는 게 안전합니다.
  2. 2Select-Object 뒤의 열 이름을 1단계에서 본 키로 바꿉니다. 안에 묶인 값은 @{ n = '새 열 이름'; e = { $_.바깥키.안쪽키 } } 처럼 꺼냅니다.
  3. 3통째로 붙여 넣고 Enter. 아무 메시지 없이 끝나면 $out 에 CSV 가 생깁니다.

결과는 456바이트, 첫 3바이트가 EF BB BF(BOM)인 CSV 였고, 열 12개(id … city, district, tags, email, order_no)에 둘째 사람의 email·셋째 사람의 order_no 가 제자리에 들어갔습니다. 쉼표가 든 값은 따옴표로 감싸지고("Lee, Seoyeon"), 값 안의 따옴표는 두 번 겹쳐(""VIP"") 저장됐습니다.

⚠️

코드를 .ps1 파일로 저장해 실행할 땐 UTF-8(BOM) 으로 저장하세요. 윈도우 PowerShell 5.1 은 BOM 없는 .ps1 을 ANSI 로 읽어 한글 주석·경로가 깨집니다(이 PC 실측: 한글 주석 다음 줄이 실행되지 않음). 창에 붙여 넣어 실행할 땐 상관없습니다.

JSON 이 { "items": [ … ] } 처럼 바깥이 한 번 더 싸여 있으면 $rows = (Get-Content $src -Raw -Encoding UTF8 | ConvertFrom-Json).items 처럼 목록이 든 키를 꺼낸 뒤 똑같이 하면 됩니다(시험: 2개 항목 그대로 꺼내짐).

PowerShell 에서 실제로 겪은 함정 6가지

검색하면 나오는 한 줄짜리 명령을 그대로 돌리면 이렇게 됩니다. 같은 시험 파일로 하나씩 재현했습니다.

한 일결과 (실측)
Get-Content … | ConvertFrom-Json | Export-Csv 한 줄열 8개: Count, Length, LongLength, Rank, SyncRoot … 값은 3, 3, 3, 1, System.Object[] (154바이트) — 회원 정보가 없음
Export-Csv 에 -Encoding 없음한글이 전부 ??? (김민준 → ???), 394바이트
Get-Content 에 -Encoding 없음한글이 깨진 채 읽혀 ConvertFrom-Json 오류: 잘못된 개체가 전달되었습니다. : 또는 }가 필요합니다. (497)
-NoTypeInformation 없음첫 줄에 #TYPE System.Management.Automation.PSCustomObject
안쪽 객체·배열을 그대로address 칸에 @{city=서울; district=중구}, tags 칸에 System.Object[]
항목마다 다른 키email·order_no 열이 아예 없음 — 오류도 경고도 없음

첫 줄은 윈도우 PowerShell 5.1 의 ConvertFrom-Json 이 JSON 배열을 한 덩어리로 다음 명령에 넘겨서 생깁니다. Export-Csv 는 회원 3명이 아니라 '배열 하나'를 받아 배열 자체의 속성(Count, Length…)을 열로 씁니다. 결과를 변수에 담거나 괄호로 감싸면 배열이 풀려 한 명당 한 줄이 됩니다.

나머지는 마이크로소프트의 Export-Csv(5.1) 문서에 그대로 적혀 있습니다. -Encoding 의 기본값은 ASCII 이고, #TYPE 머리글은 PowerShell 6.0 전까지 기본으로 붙습니다. 열은 처음 받은 객체의 속성으로 정하고, 뒤 객체에 더 있는 속성은 파일에 넣지 않는다고 설명합니다 — 그래서 email·order_no 가 조용히 빠졌습니다.

안쪽 객체·배열: 그대로 넘기면 vs 칸을 꺼내면 (실측)

방법 2: 파이썬 — 설치할 모듈 없이 표준 csv 로

파이썬이 있으면 pip 설치 없이 표준 모듈 json·csv 만으로 됩니다. 아래 코드는 안쪽 객체를 address.city 처럼 점으로 이은 열로 펼치고, 배열은 ; 로 이어 붙이고, 모든 항목의 키를 모아 열을 만듭니다.

python
import csv, json

def flatten(obj, prefix=""):
    out = {}
    for k, v in obj.items():
        key = prefix + k
        if isinstance(v, dict):                     # {"address": {"city": …}} → address.city
            out.update(flatten(v, key + "."))
        elif isinstance(v, list):                   # ["신규", "쿠폰"] → 신규;쿠폰
            out[key] = ";".join(str(x) for x in v)
        else:
            out[key] = v
    return out

with open("data.json", encoding="utf-8") as f:
    rows = [flatten(r) for r in json.load(f)]

keys = []                                           # 모든 항목의 키를 모은다(첫 항목에 없는 키도)
for r in rows:
    for k in r:
        if k not in keys:
            keys.append(k)

with open("data.csv", "w", encoding="utf-8-sig", newline="") as f:   # BOM + newline=""
    w = csv.DictWriter(f, fieldnames=keys)
    w.writeheader()
    w.writerows(rows)

data.json 과 같은 폴더에서 실행하면 392바이트 CSV(BOM 포함, 열 12개)가 생깁니다. 숫자는 그대로 숫자로, 비어 있는 값(null·없는 키)은 빈칸으로 저장됐습니다.

  • fieldnames 를 첫 항목 키로 주면 멈춘다. fieldnames=data[0].keys() 는 ValueError: dict contains fields not in fieldnames: 'email' 로 끝났습니다. 파이썬 문서대로 DictWriter 는 모르는 키가 오면 기본으로 ValueError 를 냅니다(extrasaction='raise').
  • newline="" 를 빼면 줄 사이에 빈 줄. 줄 끝이 \r\r\n 으로 저장돼(4곳) 엑셀에서 4줄짜리 표가 7줄로, 사람 사이마다 빈 줄이 끼어 열렸습니다. 파이썬 문서도 newline='' 를 주지 않으면 \r 이 하나 더 붙는다고 적고 있습니다.
  • encoding="utf-8" 만 주면 엑셀에서 한글이 깨진다. 파일 자체는 멀쩡하지만 BOM 이 없어서입니다(다음 절). 엑셀용이면 utf-8-sig.
  • 펼치지 않으면 주소 칸에 {'city': '서울', 'district': '중구'}, 태그 칸에 ['신규', '쿠폰'] 처럼 파이썬 모양 글자가 그대로 들어갑니다.

엑셀로 열 때: 한글 깨짐과 사라지는 0

마이크로소프트 지원 문서는 UTF-8 CSV 가 BOM 과 함께 저장됐을 때만 엑셀에서 그냥 열린다고 안내합니다. BOM 없는 CSV 를 엑셀로 열자 김민준이 源誘쇱? 로 깨졌고, 더 나쁜 건 깨진 글자가 쉼표를 삼켜 셋째 줄은 이름과 전화번호가 한 칸에 붙고 뒤 칸이 한 칸씩 밀렸다는 점입니다. 눈에 띄는 깨짐보다 열이 밀린 걸 놓치기 쉽습니다.

BOM 이 있어 한글이 멀쩡해도, 엑셀은 숫자처럼 생긴 글자를 숫자로 바꿔 버립니다. CSV 파일 안에는 01012345678 이 그대로 있는데 엑셀이 열면서 바꾸는 것입니다.

CSV 를 엑셀로 열었을 때 바뀐 값 (실측)
칸JSON 값CSV 를 엑셀로 열면파워 쿼리로 JSON 을 읽으면
phone"01012345678"1012345678 (화면엔 1.01E+09)01012345678 (글자)
zip"04524"452404524 (글자)
order_no"2026101900000123"2026101900000120 (화면엔 2.03E+15)2026101900000123 (글자)
joined"2026-10-19"날짜 값 (열 폭이 좁으면 ####)2026-10-19 (글자)

마이크로소프트 지원 문서 '앞자리 0 과 큰 숫자 유지'는 엑셀이 앞자리 0 을 자동으로 지우고, 정밀도가 15자리까지라 16자리부터는 끝자리를 0 으로 바꾼다고 설명합니다. 이미 바뀐 칸은 서식을 텍스트로 바꿔도 되돌아오지 않으니, 열기 전에 막아야 합니다. 문서가 권하는 방법 중 하나가 파워 쿼리에서 열 형식을 텍스트로 두는 것입니다.

방법 3: 엑셀 파워 쿼리로 JSON 을 바로 (최종 목적이 엑셀이라면)

결국 엑셀 표로 볼 거라면 CSV 를 거치지 않는 편이 낫습니다. 엑셀에 들어 있는 파워 쿼리가 JSON 을 바로 읽습니다(마이크로소프트 Learn 의 JSON 커넥터 문서 — 지원 제품에 Excel 포함).

  1. 1엑셀에서 데이터 → 데이터 가져오기 → 파일 → JSON에서 를 고릅니다(마이크로소프트 지원 문서의 메뉴 이름, 버전에 따라 조금 다를 수 있음).
  2. 2JSON 파일을 고르면 파워 쿼리 편집기가 열립니다.
  3. 3주소처럼 안에 묶인 칸은 열 머리글의 펼치기 단추로 안쪽 키를 고릅니다.
  4. 4전화번호처럼 0 이 중요한 열의 형식이 텍스트인지 확인한 뒤 닫기 및 로드.

같은 엔진(Json.Document)으로 시험 파일을 읽어 시트에 불러오자 01012345678·04524·2026101900000123·2026-10-19 가 전부 글자 그대로 남았습니다. JSON 에서 따옴표로 감싼 값은 글자로 들어오기 때문입니다. 안에 묶인 값은 펼치기 전엔 Record·List 로 보였습니다. 편집기 화면 자체는 이 글에서 따로 확인하지 않았습니다.

이 표를 다시 CSV 로 내보내야 하면 다른 이름으로 저장 → CSV UTF-8(쉼표로 분리) 로 저장합니다. 시험해 보니 BOM 이 붙은 392바이트, 파이썬 결과와 같은 크기였고 0 도 파일 안에선 살아 있었습니다. 다만 그 CSV 를 엑셀로 다시 열면 0 이 또 사라졌습니다 — CSV 는 받는 쪽 프로그램용으로 넘기고, 엑셀에서 볼 땐 원본 통합 문서를 쓰세요.

비교

방법설치한글안쪽 객체·배열첫 항목에 없는 키엑셀의 앞자리 0
PowerShell 한 줄(검색에 흔한 것)없음??? (기본 ASCII)@{…} · System.Object[]빠짐사라짐
PowerShell (이 글의 코드)없음정상 (BOM)칸으로 꺼냄열 이름을 적어 주면 들어감CSV 로 열면 사라짐
파이썬 표준 csv (이 글의 코드)파이썬정상 (utf-8-sig)address.city 로 펼침자동으로 모음CSV 로 열면 사라짐
엑셀 파워 쿼리없음 (엑셀)정상펼치기 단추—남음 (글자)

결과가 이상할 때 확인 순서

JSON → CSV 가 이상할 때 위에서부터
  1. 1열 이름이 Count·Length… — 배열이 통째로 넘어갔습니다. 결과를 변수에 담거나 ( ) 로 감싼 뒤 Export-Csv 로 넘깁니다.
  2. 2한글이 ??? 또는 깨진 글자 — ??? 면 저장할 때, 깨진 글자나 JSON 오류면 읽을 때 인코딩이 빠진 것입니다. 엑셀에서만 깨지면 BOM 이 없는 것입니다.
  3. 3칸에 @{…}·System.Object[]·{'city': …} — 안쪽 객체와 배열을 펼치지 않았습니다. 이 글의 코드처럼 칸을 하나씩 꺼냅니다.
  4. 4열이 빠졌거나 엑셀에서 0 이 사라짐 — 첫 항목 기준으로 열을 정했거나, 엑셀이 숫자로 바꾼 것입니다. 키 목록을 먼저 보고, 엑셀용이면 파워 쿼리로 읽습니다.

JSON 자체가 깨져 있으면 ConvertFrom-Json 이나 json.load 가 처음부터 멈춥니다. 그럴 땐 JSON 포매터에 붙여 넣으면 틀린 줄과 칸을 짚어 줍니다.

자주 묻는 질문

Q. CSV 를 엑셀로 열면 전화번호 앞의 0 이 사라져요. 파일이 잘못 만들어진 건가요?

아니요. 시험한 CSV 파일 안에는 01012345678 이 그대로 있었고, 엑셀이 열면서 숫자 1012345678 로 바꿨습니다. 엑셀에서 볼 거라면 데이터 → 데이터 가져오기 → JSON에서 로 JSON 을 바로 읽으세요. 시험에선 0 이 그대로 남았습니다.

Q. 값에 쉼표나 따옴표, 줄바꿈이 있으면 칸이 깨지지 않나요?

세 방법 모두 그런 값을 따옴표로 감쌌습니다. "Lee, Seoyeon" 은 한 칸으로, 메모 안의 따옴표는 두 번 겹쳐 저장됐고, 줄바꿈이 든 메모도 엑셀에서 한 칸으로 열렸습니다.

Q. 한 줄 명령이 왜 Count·Length 만 내놓나요?

윈도우 PowerShell 5.1 의 ConvertFrom-Json 이 배열을 한 덩어리로 넘기기 때문입니다(이 PC 실측). 결과를 변수에 담거나 괄호로 감싸면 항목마다 한 줄이 됩니다.

Q. PowerShell 7 에서도 똑같나요?

마이크로소프트 문서상 #TYPE 머리글은 6.0 부터 기본으로 붙지 않습니다. 이 PC 에는 PowerShell 7 이 없어 나머지 동작은 시험하지 않았습니다.

Q. 온라인 변환 사이트를 써도 되나요?

이 글에서는 시험하지 않았습니다. 회원 정보나 회사 API 응답처럼 밖으로 보내면 안 되는 데이터라면 PC 안에서 끝나는 이 글의 세 방법을 권합니다.

이 글에서 소개하는 무료 도구
JSON 포매터

변환하기 전에 JSON 이 깨지지 않았는지 볼 때 씁니다. 붙여넣으면 정렬해 주고, 틀린 곳이 있으면 줄·칸 위치를 짚어 줍니다. 브라우저 안에서만 처리해 데이터가 밖으로 나가지 않습니다.

  • ✓ 무료
  • ✓ 설치·회원가입 없음
  • ✓ 브라우저에서 바로 실행
  • ✓ 파일이 서버로 올라가지 않음

🔒 파일을 서버나 다른 어떤 곳으로도 보내지 않습니다 — 내 컴퓨터의 브라우저 안에서만 처리합니다.

이동할 주소 — 지금 보고 있는 이 사이트(coding-now.com) 안의 페이지입니다
🔒 https://www.coding-now.com/json-formatter

댓글 0

아직 댓글이 없습니다. 첫 댓글을 남겨 주세요.

댓글은 회원만 쓸 수 있습니다.

광고·욕설·비방·개인정보·불법 내용이 담긴 댓글은 숨기거나 지웁니다. 댓글은 닉네임과 함께 공개됩니다. 개인정보처리방침

다른 글