JSON to CSV 변환기 - JSON 배열을 CSV로 변환 온라인
JSON 배열과 CSV/TSV 형식 간 변환. 중첩 객체 평탄화, 테이블 데이터 미리보기, 구분자 커스텀 가능.
자주 묻는 질문
JSON to CSV 변환기란 무엇인가요?
JSON to CSV 변환기는 JSON(JavaScript Object Notation) 데이터를 CSV(Comma-Separated Values) 또는 TSV(Tab-Separated Values) 표 형식으로 변환하거나, 그 반대로 변환하는 도구입니다. JSON은 중첩된 객체와 배열로 데이터를 저장하고, CSV는 구분 문자로 구분된 행과 열로 데이터를 표현합니다. 개발자와 데이터 분석가는 API 응답을 스프레드시트로 내보내거나, CSV 데이터를 JSON 기반 애플리케이션에 가져오거나, 시스템 간 데이터를 마이그레이션할 때 이 형식 간 변환이 자주 필요합니다. 이 변환기는 중첩된 객체를 점 표기법 열 머리글(예: user.address.city)로 평탄화하고 RFC 4180에 따라 특수 문자를 적절히 이스케이프합니다.
이 JSON to CSV 변환기는 어떻게 사용하나요?
1. 탭을 사용하여 변환 방향을 선택하세요: JSON to CSV 또는 CSV to JSON. 2. 입력 영역에 데이터를 붙여넣거나 업로드 버튼으로 파일을 업로드하세요. 3. 입력하는 동시에 실시간으로 자동 변환됩니다. 4. JSON to CSV: 구분자(쉼표, 탭, 세미콜론)를 선택하고 헤더 행 포함, 중첩 객체 평탄화 등의 옵션을 토글하세요. 5. CSV to JSON: 구분자가 자동 감지되거나 수동으로 선택할 수 있습니다. 6. 출력 패널과 아래의 시각적 미리보기 테이블에서 결과를 확인하세요. 7. 복사 버튼으로 결과를 복사하거나 다운로드 버튼으로 파일로 저장하세요.
데이터가 안전한가요? 서버로 전송되나요?
데이터는 100% 안전하며 브라우저를 벗어나지 않습니다. 이 변환기는 전적으로 클라이언트 측 JavaScript로 실행됩니다. 어떤 데이터도 서버로 전송되거나, 데이터베이스에 저장되거나, 어디에도 기록되지 않습니다. 모든 파싱, 평탄화, 이스케이프 및 변환은 네이티브 브라우저 API를 사용하여 로컬 기기에서 수행됩니다. 인터넷 연결을 끊어도 초기 페이지 로드 후에는 완전히 오프라인으로 작동합니다.
변환기가 중첩된 JSON 객체를 어떻게 처리하나요?
중첩된 JSON 객체는 점 표기법 열 머리글을 사용하여 평탄화됩니다. 예를 들어, {"user": {"name": "Alice", "address": {"city": "Seoul"}}}은 user.name과 user.address.city라는 열을 생성합니다. 객체 내의 배열은 두 가지 방법으로 처리할 수 있습니다: (1) 문자열화 모드는 배열을 셀 내 JSON 문자열로 변환하고, (2) 행 확장 모드는 각 배열 요소마다 별도의 행을 생성합니다.
이 도구는 어떤 CSV/TSV 형식을 생성하나요?
이 도구는 RFC 4180을 준수하는 CSV 출력을 생성합니다. 구분 문자, 큰따옴표 또는 줄 바꿈을 포함하는 필드는 자동으로 큰따옴표로 묶이고, 필드 값 내의 큰따옴표는 두 번 반복하여 이스케이프됩니다. 첫 번째 행에는 기본적으로 열 머리글이 포함됩니다(설정 가능). TSV 출력의 경우 쉼표 대신 탭 문자가 구분자로 사용됩니다.
JSON 데이터가 배열이 아닌 경우 어떻게 하나요?
이 변환기는 JSON 객체 배열을 입력으로 기대합니다(예: [{"name": "Alice"}, {"name": "Bob"}]). 입력이 단일 JSON 객체인 경우 변환기가 자동으로 단일 요소 배열로 감싸서 변환합니다. 데이터가 중첩되어 있고 배열이 속성 내부에 있는 경우(예: {"data": {"results": [...]}}), 배열 부분을 먼저 추출해야 합니다.
CSV를 중첩 객체가 있는 JSON으로 어떻게 변환하나요?
CSV를 JSON으로 변환할 때, 변환기는 기본적으로 각 열 머리글이 키가 되고 각 행이 객체가 되는 평면 JSON 객체 배열을 생성합니다. 타입 추론이 지원됩니다: 숫자 문자열은 숫자로, true/false는 불리언으로, null은 null로 변환됩니다. 모든 값을 문자열로 유지하려면 타입 자동 감지 옵션을 비활성화하세요.
코드 예제
// JSON Array to CSV Converter (Client-side, no dependencies)
function flattenObject(obj, prefix = "") {
const result = {};
for (const [key, value] of Object.entries(obj)) {
const fullKey = prefix ? `${prefix}.${key}` : key;
if (value !== null && typeof value === "object" && !Array.isArray(value)) {
Object.assign(result, flattenObject(value, fullKey));
} else {
result[fullKey] = value;
}
}
return result;
}
function escapeField(value, delimiter = ",") {
if (value === null || value === undefined) return "";
const str = typeof value === "object" ? JSON.stringify(value) : String(value);
if (str.includes(delimiter) || str.includes('"') || str.includes("\n")) {
return `"${str.replace(/"/g, '""')}"`;
}
return str;
}
function jsonToCsv(jsonArray, options = {}) {
const { delimiter = ",", includeHeader = true, flatten = true } = options;
const rows = flatten ? jsonArray.map(item => flattenObject(item)) : jsonArray;
const headerSet = new Set();
rows.forEach(row => Object.keys(row).forEach(key => headerSet.add(key)));
const headers = Array.from(headerSet);
const lines = [];
if (includeHeader) {
lines.push(headers.map(h => escapeField(h, delimiter)).join(delimiter));
}
for (const row of rows) {
lines.push(headers.map(h => escapeField(row[h], delimiter)).join(delimiter));
}
return lines.join("\n");
}
// Example usage
const data = [
{ name: "Alice", age: 30, address: { city: "Seoul" } },
{ name: "Bob", age: 25, address: { city: "Tokyo" } }
];
console.log(jsonToCsv(data));
// name,age,address.city
// Alice,30,Seoul
// Bob,25,Tokyo