什麼是JSON,為什麼要轉換為CSV?
JSON(JavaScript物件表示法) 是一種輕量級、人類可讀的資料格式,廣泛用於Web服務和應用程式之間的資料交換。它支援複雜的巢狀結構,包括物件、陣列和多種資料類型。
CSV(逗號分隔值) 是一種簡單的表格格式,每一列代表一列資料,值之間用分隔符號(通常是逗號)分隔。它被電子試算表應用、資料庫和資料分析工具普遍支援。
為什麼要將JSON轉換為CSV?
在許多場景中,將JSON轉換為CSV是必不可少的:
- 在Excel/Google Sheets中進行資料分析 - 電子試算表應用無法直接匯入複雜的JSON
- 資料庫匯入 - 許多資料庫接受CSV進行批次資料載入
- 資料視覺化 - Tableau、Power BI等工具通常需要表格格式
- 業務報告 - 非技術人員更喜歡電子試算表友善的格式
- 舊系統整合 - 舊系統可能只支援CSV匯入
- 檔案大小減小 - CSV檔案通常比等效的JSON小20-40%
常見使用場景
| 場景 | 為什麼CSV更好 |
|---|---|
| API回應處理 | 將API資料轉換為電子試算表分析 |
| 日誌檔案分析 | 扁平化結構化日誌以便於過濾 |
| 匯出使用者資料 | 提供使用者友善格式的可下載資料 |
| 資料遷移 | 在不同系統之間傳輸資料 |
| 報告產生 | 為業務使用者建立自動化報告 |
| 機器學習 | 準備ML訓練資料集(許多函式庫更喜歡CSV) |
理解JSON結構類型
在轉換之前,瞭解您的JSON結構很重要:
簡單扁平JSON(最容易轉換)
[
{
"name": "張三",
"email": "zhangsan@example.com",
"age": 28
},
{
"name": "李四",
"email": "lisi@example.com",
"age": 34
}
]
CSV輸出:
name,email,age
張三,zhangsan@example.com,28
李四,lisi@example.com,34
巢狀物件(需要扁平化)
[
{
"name": "張三",
"address": {
"city": "台北",
"zip": "100"
}
}
]
CSV輸出(扁平化):
name,address.city,address.zip
張三,台北,100
巢狀陣列(複雜)
[
{
"name": "張三",
"skills": ["Python", "JavaScript", "SQL"]
}
]
CSV輸出選項:
選項1:陣列作為字串
name,skills
張三,"Python, JavaScript, SQL"
選項2:展開為多列
name,skill
張三,Python
張三,JavaScript
張三,SQL
將JSON轉換為CSV:Python指南
Python是資料轉換中最流行的語言。這裡是一個綜合指南:
方法1:使用Pandas(推薦用於複雜JSON)
import pandas as pd
import json
# 載入JSON資料
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 轉換為DataFrame
df = pd.DataFrame(data)
# 處理巢狀物件(扁平化)
df_flattened = pd.json_normalize(data)
# 儲存為CSV
df_flattened.to_csv('output.csv', index=False, encoding='utf-8')
print("✅ 轉換完成!已儲存到 output.csv")
進階:處理巢狀陣列
import pandas as pd
# 包含巢狀陣列的範例資料
data = [
{
"name": "張三",
"skills": ["Python", "SQL"],
"experience": {"years": 5, "company": "科技公司"}
}
]
# 扁平化巢狀結構
df = pd.json_normalize(
data,
sep='_', # 對巢狀鍵使用底線
max_level=2 # 控制扁平化深度
)
# 對於陣列:展開為多列
df_exploded = df.explode('skills')
df_exploded.to_csv('output.csv', index=False)
方法2:使用內建CSV模組(無相依性)
import json
import csv
# 載入JSON
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 從第一個物件提取標題
headers = data[0].keys()
# 寫入CSV
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=headers)
writer.writeheader()
writer.writerows(data)
print("✅ CSV檔案建立成功!")
方法3:處理複雜巢狀JSON
import json
import csv
def flatten_json(nested_json, parent_key='', sep='.'):
"""
遞迴扁平化巢狀JSON物件
"""
items = []
for k, v in nested_json.items():
new_key = f"{parent_key}{sep}{k}" if parent_key else k
if isinstance(v, dict):
items.extend(flatten_json(v, new_key, sep=sep).items())
elif isinstance(v, list):
# 將清單轉換為逗號分隔的字串
items.append((new_key, ', '.join(map(str, v))))
else:
items.append((new_key, v))
return dict(items)
# 載入巢狀JSON
with open('nested_data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 扁平化所有物件
flattened_data = [flatten_json(item) for item in data]
# 獲取所有唯一鍵(某些物件可能有不同的結構)
all_keys = set()
for item in flattened_data:
all_keys.update(item.keys())
# 寫入CSV
with open('output.csv', 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=sorted(all_keys))
writer.writeheader()
writer.writerows(flattened_data)
print("✅ 巢狀JSON已扁平化為CSV!")
不想寫程式碼? 使用我們的免費JSON轉CSV轉換器 - 它自動處理所有這些場景,零編碼要求。只需貼上您的JSON並立即下載CSV!
將JSON轉換為CSV:JavaScript/Node.js指南
用於前端應用或Node.js環境:
瀏覽器(用戶端)
// 範例JSON資料
const jsonData = [
{ name: '張三', email: 'zhangsan@example.com', age: 28 },
{ name: '李四', email: 'lisi@example.com', age: 34 }
];
function convertToCSV(jsonArray) {
if (!jsonArray || jsonArray.length === 0) return '';
// 提取標題
const headers = Object.keys(jsonArray[0]);
// 建立標題列
const headerRow = headers.join(',');
// 建立資料列
const dataRows = jsonArray.map(obj => {
return headers.map(header => {
const value = obj[header];
// 跳脫引號並在包含逗號時用引號包裹
const escaped = String(value).replace(/"/g, '""');
return escaped.includes(',') ? `"${escaped}"` : escaped;
}).join(',');
});
return [headerRow, ...dataRows].join('\n');
}
// 轉換並下載
const csv = convertToCSV(jsonData);
const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'data.csv';
link.click();
console.log('✅ CSV已下載!');
Node.js(使用json2csv函式庫)
const { parse } = require('json2csv');
const fs = require('fs');
// 範例資料
const data = [
{
name: '張三',
email: 'zhangsan@example.com',
address: { city: '台北', zip: '100' }
}
];
// 設定選項
const opts = {
fields: ['name', 'email', 'address.city', 'address.zip'],
flatten: true, // 自動扁平化巢狀物件
header: true
};
try {
const csv = parse(data, opts);
fs.writeFileSync('output.csv', csv, 'utf-8');
console.log('✅ CSV檔案建立成功!');
} catch (err) {
console.error('❌ 將JSON轉換為CSV時出錯:', err);
}
JSON轉CSV轉換的最佳實踐
1. 處理資料類型一致性
# 確保資料類型一致
df['age'] = pd.to_numeric(df['age'], errors='coerce') # 轉換為數字
df['date'] = pd.to_datetime(df['date'], errors='coerce') # 解析日期
2. 處理缺失值
# 填充缺失值
df.fillna('N/A', inplace=True) # 將NaN替換為'N/A'
# 或刪除包含缺失值的列
df.dropna(inplace=True)
3. 跳脫特殊字元
CSV需要正確跳脫:
- 逗號 - 用引號包裹欄位:
"台北, 信義區" - 引號 - 雙引號:
"她說 ""你好""" - 換行符號 - 用引號包裹:
"第1列\n第2列"
# Pandas自動處理這個
df.to_csv('output.csv', index=False, quoting=csv.QUOTE_NONNUMERIC)
4. 選擇正確的分隔符號
對於包含逗號的資料,考慮替代分隔符號:
# 使用分號(在歐洲常見)
df.to_csv('output.csv', sep=';', index=False)
# 使用定位字元
df.to_csv('output.tsv', sep='\t', index=False)
# 使用豎線
df.to_csv('output.csv', sep='|', index=False)
5. 高效處理大檔案
# 分塊處理大檔案
chunk_size = 10000
for chunk in pd.read_json('large_file.json', lines=True, chunksize=chunk_size):
chunk.to_csv('output.csv', mode='a', header=False, index=False)
6. 保留Unicode字元
# 始終指定UTF-8編碼
df.to_csv('output.csv', encoding='utf-8-sig', index=False) # 帶BOM的UTF-8用於Excel
進階場景
將API回應轉換為CSV
import requests
import pandas as pd
# 從API獲取資料
response = requests.get('https://api.example.com/users')
data = response.json()
# 轉換為CSV
df = pd.DataFrame(data['results']) # 大多數API會包裝資料
df.to_csv('api_export.csv', index=False)
喜歡無程式碼解決方案? 我們的JSON轉CSV轉換器可以直接處理API回應 - 只需貼上JSON並立即轉換!
批次轉換多個JSON檔案
import glob
import pandas as pd
# 尋找所有JSON檔案
json_files = glob.glob('data/*.json')
# 合併所有到一個CSV
combined_df = pd.DataFrame()
for file in json_files:
df = pd.read_json(file)
combined_df = pd.concat([combined_df, df], ignore_index=True)
combined_df.to_csv('combined_output.csv', index=False)
print(f"✅ 已合併{len(json_files)}個檔案到combined_output.csv")
保留複雜資料結構
對於深度巢狀的JSON,考慮保留一些結構:
import json
import pandas as pd
# 載入複雜JSON
with open('complex.json') as f:
data = json.load(f)
# 部分扁平化:將陣列保留為JSON字串
df = pd.json_normalize(data, max_level=1)
# 將剩餘的巢狀結構轉換為JSON字串
for col in df.columns:
if df[col].apply(lambda x: isinstance(x, (dict, list))).any():
df[col] = df[col].apply(json.dumps)
df.to_csv('output.csv', index=False)
常見問題和解決方案
問題1:JSON結構不一致
問題: 物件有不同的鍵
[
{"name": "張三", "age": 28, "city": "台北"},
{"name": "李四", "email": "lisi@example.com"}
]
解決方案: 使用json_normalize處理缺失鍵
df = pd.json_normalize(data)
# 缺失值自動填充為NaN
問題2:Excel不能正確顯示CSV
問題: 特殊字元顯示為亂碼
解決方案: 使用帶BOM的UTF-8編碼
df.to_csv('output.csv', encoding='utf-8-sig', index=False)
問題3:非常大的JSON陣列
問題: 巨大檔案導致記憶體錯誤
解決方案: 串流處理
import ijson # 安裝: pip install ijson
with open('huge.json', 'rb') as f:
objects = ijson.items(f, 'item')
# 批次處理
batch = []
for obj in objects:
batch.append(obj)
if len(batch) >= 1000:
pd.DataFrame(batch).to_csv('output.csv', mode='a', header=False)
batch = []
問題4:日期/時間格式問題
問題: 日期未被電子試算表應用識別
解決方案: 標準化日期格式
df['date'] = pd.to_datetime(df['date']).dt.strftime('%Y-%m-%d')
工具對比:線上 vs 程式化
| 方面 | 線上轉換器 | Python指令碼 | Node.js指令碼 |
|---|---|---|---|
| 設定 | 無(基於瀏覽器) | 需要Python + 函式庫 | 需要Node.js + npm |
| 最適合 | 快速一次性轉換 | 大型/複雜檔案,自動化 | 前端整合 |
| 檔案大小限制 | ~500MB(瀏覽器記憶體) | 受磁碟空間限制 | 受記憶體限制 |
| 隱私 | 100%本機(我們的工具) | 100%本機 | 100%本機 |
| 速度 | 小檔案快 | 大檔案最快 | 中等檔案快 |
| 自訂 | UI選項 | 完全控制 | 完全控制 |
| 學習曲線 | 零 | 基礎Python知識 | JavaScript知識 |
| 批次處理 | 手動 | 易於自動化 | 易於自動化 |
試用我們的免費JSON轉CSV轉換器
需要在不編寫任何程式碼的情況下將JSON轉換為CSV嗎?使用我們的**免費線上JSON轉CSV轉換器** - 專為重視隱私和效率的開發者和資料專業人員打造。
為什麼選擇我們的轉換器?
✅ 100%基於瀏覽器 - 所有處理都在本機進行,您的資料永不離開裝置 ✅ 隱私優先 - 無追蹤、無Cookie,符合GDPR/CCPA ✅ 處理複雜JSON - 自動扁平化巢狀物件和陣列 ✅ 可自訂選項 - 選擇分隔符號、編碼和格式 ✅ 無需註冊 - 完全免費,無限次轉換 ✅ 多語言支援 - 提供簡體中文、繁體中文和English ✅ 深色模式 - 深夜除錯時護眼 ✅ 快速可靠 - 針對效能最佳化,即時預覽
功能包括:
- 拖放檔案上傳
- 即時驗證和錯誤偵測
- 下載前預覽
- 自訂分隔符號設定(逗號、分號、定位字元、豎線)
- 多種編碼選項(UTF-8、UTF-16、ASCII)
- 一鍵複製到剪貼簿
- 批次檔案處理(即將推出)
- 轉換歷史(即將推出)
常見問題
可以直接將JSON轉換為Excel嗎?
雖然我們的工具轉換為CSV(Excel可以開啟),您也可以使用Python的openpyxl或xlsxwriter函式庫建立原生Excel檔案:
df.to_excel('output.xlsx', index=False, engine='openpyxl')
然而,CSV通常更受歡迎,因為它更簡單、更快且具有普遍相容性。
如何處理根層級的JSON陣列?
如果您的JSON是物件陣列[{...}, {...}],大多數轉換器會自動處理。如果是單一物件{...},請將其包裝在陣列中或在Python中使用pd.json_normalize()。
JSON Lines和常規JSON有什麼區別?
JSON Lines(JSONL/NDJSON)每列有一個JSON物件:
{"name": "張三", "age": 28}
{"name": "李四", "age": 34}
轉換使用:
df = pd.read_json('data.jsonl', lines=True)
可以自動化JSON到CSV的轉換嗎?
可以!使用帶有cron作業(Linux/Mac)或工作排程器(Windows)的Python指令碼:
# Cron作業:每天凌晨2點執行
0 2 * * * python /path/to/convert_script.py
總結
將JSON轉換為CSV是開發者、資料分析師和任何使用現代API和資料系統的人的基本技能。無論您選擇:
- 使用我們的免費線上轉換器 進行快速、隱私優先的轉換
- 編寫Python指令碼 用於自動化資料管線
- 實作JavaScript解決方案 用於前端應用
關鍵是理解您的資料結構並為任務選擇正確的工具。
對於大多數使用者,我們的**JSON轉CSV轉換器** 提供了簡單性和強大功能的完美平衡 - 無需安裝,完全私密,永久免費。
立即開始轉換,體驗將JSON資料轉換為電子試算表就緒的CSV格式的最快方式!