返回 網站動態
DevTool Team
更新於 3月23日

JSON 轉 CSV 線上轉換指南:Python 範例、巢狀 JSON 與批次處理

學習如何把 JSON 線上轉換為 CSV,涵蓋 Python 程式碼範例、巢狀 JSON 展平、批次轉換,以及 Excel、Google Sheets 匯入場景。

什麼是JSON,為什麼要轉換為CSV?

JSON(JavaScript物件表示法) 是一種輕量級、人類可讀的資料格式,廣泛用於Web服務和應用程式之間的資料交換。它支援複雜的巢狀結構,包括物件、陣列和多種資料類型。

CSV(逗號分隔值) 是一種簡單的表格格式,每一列代表一列資料,值之間用分隔符號(通常是逗號)分隔。它被電子試算表應用、資料庫和資料分析工具普遍支援。

為什麼要將JSON轉換為CSV?

在許多場景中,將JSON轉換為CSV是必不可少的:

  1. 在Excel/Google Sheets中進行資料分析 - 電子試算表應用無法直接匯入複雜的JSON
  2. 資料庫匯入 - 許多資料庫接受CSV進行批次資料載入
  3. 資料視覺化 - Tableau、Power BI等工具通常需要表格格式
  4. 業務報告 - 非技術人員更喜歡電子試算表友善的格式
  5. 舊系統整合 - 舊系統可能只支援CSV匯入
  6. 檔案大小減小 - 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到CSV →

常見問題

可以直接將JSON轉換為Excel嗎?

雖然我們的工具轉換為CSV(Excel可以開啟),您也可以使用Python的openpyxlxlsxwriter函式庫建立原生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格式的最快方式!


有更多問題?查看我們的綜合FAQ或瀏覽我們收藏中的更多開發者工具