ChatGPT 匯出 JSON — 將對話匯出並儲存為結構化資料(2026)
重點摘要
- JSON 是程式化使用的最佳格式 — 使用 Python、jq 或任何語言解析它,即可分析、轉換或自動化你的 ChatGPT 對話。
- 三種方法可選:ChatGPT Exporter(即時、乾淨的 JSON)、OpenAI 官方資料匯出(批次、複雜巢狀格式)以及瀏覽器開發者工具(手動、原始 API 資料)。
- OpenAI 的原生匯出使用基於樹狀的
mapping結構,包含父子引用,需要大量解析工作 — ChatGPT Exporter 則提供扁平、可直接用於腳本的格式。 - 獨家保留的資料:Deep Research 引用、o1/o3 思維過程、網頁搜尋來源和 Canvas 成品 — 這些是其他 JSON 匯出工具無法擷取的功能。
1. 簡介
JSON(JavaScript Object Notation)是結構化資料交換的標準格式 — 被幾乎所有現代 Web API 使用,且原生支援 Python、JavaScript、Go、R 和其他所有主流程式語言。
如果你想分析 ChatGPT 的對話模式、以程式化方式提取程式碼區塊、建立微調資料集、在工具之間遷移資料,或為聊天記錄建立完整備份,JSON 就是讓你完全掌控資料的格式。
本指南涵蓋 2026 年將 ChatGPT 對話匯出為 JSON 的所有方法。我們比較三種方式 — 從一鍵式 Chrome 擴充功能到 OpenAI 官方資料匯出 — 附帶實際程式碼範例,讓你可以立即開始處理資料。(想要更易於閱讀的格式?請參閱我們的 ChatGPT 匯出 Markdown 指南或 ChatGPT 匯出 PDF 指南。)
2. 為什麼要將 ChatGPT 匯出為 JSON?
- 機器可讀 — JSON 可以被任何程式語言透過內建函式庫解析(Python 的
json、JavaScript 的JSON.parse()、Go 的encoding/json)。 - 保留完整資料 — 每條訊息、角色、時間戳記和中繼資料欄位都以結構化形式擷取 — 不像 PDF 或純文字會將所有內容扁平化。
- 易於轉換 — 透過簡短的腳本即可將 JSON 轉換為 CSV、Markdown、HTML、SQL 或任何其他格式(範例見下方第 5 節)。
- 適合資料分析 — 將對話載入 pandas、jq 或任何資料工具,分析模式、字數、主題和回覆長度。
- 備份與遷移 — JSON 是建立完整、無損備份最可靠的格式。數年後仍可還原、搜尋或重新匯入資料。
- API 相容 — JSON 是 OpenAI API 的原生格式。透過簡單的角色對應,匯出的資料可以直接轉換為 API 訊息格式。
- 適合自動化 — 將 JSON 資料輸入腳本、工作流程或管線(n8n、Make、Zapier)進行自動化處理。
- 版本控制 — JSON 檔案可與 Git 搭配使用,方便追蹤變更和比對不同版本的對話。
3. 將 ChatGPT 匯出為 JSON 的方法
3.1 ChatGPT Exporter(推薦)
ChatGPT Exporter 是一款 Chrome 擴充功能,可一鍵將任何 ChatGPT 對話匯出為 JSON。
使用方法:
- 從 Chrome Web Store 安裝 ChatGPT Exporter。
- 開啟任意 ChatGPT 對話(一般對話或群組聊天均可)。
- 點擊 Select 按鈕選擇要匯出的訊息(全部、僅提示詞、僅回覆,或手動勾選/取消勾選個別訊息)。
- 點擊 Export 並選擇 JSON 格式。
.json檔案立即下載 — 結構清晰、格式規範,可直接用於腳本。
你也可以在設定中開啟 Copy to clipboard 選項,直接將 JSON 文字複製到剪貼簿而非下載檔案 — 非常適合快速貼上到腳本或 API 工具中。
匯出的 JSON 格式範例:
匯出的檔案包含兩個頂層區段:metadata(對話資訊)和 messages(實際對話內容):
{
"metadata": {
"title": "How to Process CSV Files in Python",
"user": {
"name": "John Smith",
"email": "[email protected]"
},
"dates": {
"created": "2026/04/15 14:30:45",
"updated": "2026/04/15 15:22:10",
"exported": "2026/04/17 09:00:33"
},
"link": "https://chatgpt.com/c/abc123-def456"
},
"messages": [
{
"role": "Prompt",
"say": "How do I read a CSV file and filter specific columns in Python?",
"time": "2026/04/15 2:30:45 PM"
},
{
"role": "Response",
"say": "You can use the pandas library:\n\nimport pandas as pd\ndf = pd.read_csv('data.csv')\nresult = df[['name', 'age']]\n\nThis filters the name and age columns.",
"time": "2026/04/15 2:31:22 PM"
}
]
}注意這個乾淨的扁平結構 — 一個可以直接迭代的 messages 陣列,沒有巢狀樹或父子指標需要遍歷。
中繼資料欄位
metadata 中的每個欄位都可以在設定中個別開關:
| 欄位 | 類型 | 說明 | 可設定項 |
|---|---|---|---|
title | string | 對話標題 | 可在設定中開關 |
user.name | string | 你的顯示名稱 | 可獨立開關 |
user.email | string | 你的電子郵件地址 | 可獨立開關 |
dates.created | string | 對話建立時間 | 可選擇要包含哪些日期 |
dates.updated | string | 最後一條訊息的時間 | 可選擇要包含哪些日期 |
dates.exported | string | 匯出建立的時間 | 可選擇要包含哪些日期 |
link | string | 原始對話的 URL | 可在設定中開關 |
日期和時間格式也可以自訂:日期可選擇月/日/年、日/月/年或年/月/日,時間可選擇隱藏、12 小時制或 24 小時制。
訊息欄位
| 欄位 | 類型 | 說明 |
|---|---|---|
role | string | "Prompt"(你的訊息)或 "Response"(ChatGPT 的回覆)。在群組聊天中:"Human" 和 "ChatGPT" |
say | string | 訊息內容(純文字)。如果某條訊息未被選中匯出,則為空字串 ""(該訊息仍會出現以保留對話結構) |
time | string | 訊息時間戳記(需在設定中啟用「逐條訊息時間戳記」選項) |
內容處理
say 欄位由一條處理管線產生 — DOM 解析、功能擷取(Deep Research、網頁搜尋、推理)和格式化輸出 — 因此程式碼區塊、數學公式和結構化內容都會被準確保留,而不只是從瀏覽器的原始複製貼上。
擷取的 AI 專屬資料
| 功能 | 包含的內容 | 可設定 |
|---|---|---|
| Deep Research 報告 | 完整報告,含引用註腳和來源 URL | 可開關 |
| 網頁搜尋來源 | 來源清單,含標題和 URL | 可開關 |
| 思維過程(o1/o3) | 推理步驟、搜尋查詢、思考過程 | 可開關 |
| 程式碼區塊 | 完整程式碼,含語言標識符 | 始終包含 |
| 數學公式(KaTeX) | 保留 LaTeX 記法 | 始終包含 |
| Canvas 成品 | Canvas 模式中的程式碼和文件內容 | 始終包含 |
輸出格式
- 編碼:UTF-8
- 格式化:2 空格縮排(人類可讀)
- 檔案命名:
{前綴}{對話標題}.json— 前綴可自訂(預設為ChatGPT-),檔名經過作業系統相容性處理並進行 Unicode 正規化(NFC) - MIME 類型:
application/json
3.2 OpenAI 官方資料匯出
OpenAI 提供內建的資料匯出方式:
- 在 ChatGPT 中前往 Settings → Data Controls → Export Data。
- 等待包含 ZIP 檔案的電子郵件(通常只需幾分鐘,但最長可能需要 24 小時)。
- 解壓後找到
conversations.json。
這會產生一個包含所有對話的大型 JSON 檔案。然而,其結構明顯更加複雜 — 使用的是 OpenAI 的內部樹狀格式:
{
"title": "Conversation Title",
"create_time": 1713350400.0,
"update_time": 1713354000.0,
"mapping": {
"aaa-msg-id-1": {
"id": "aaa-msg-id-1",
"message": {
"author": { "role": "user" },
"content": {
"content_type": "text",
"parts": ["Your message here"]
},
"create_time": 1713350400.0
},
"parent": null,
"children": ["aaa-msg-id-2"]
},
"aaa-msg-id-2": {
"id": "aaa-msg-id-2",
"message": {
"author": { "role": "assistant" },
"content": {
"content_type": "text",
"parts": ["The AI response here"]
},
"create_time": 1713350415.0
},
"parent": "aaa-msg-id-1",
"children": []
}
}
}為什麼這種格式難以使用:
正如 OpenAI 開發者社群中廣泛討論的,這種樹狀結構要求你:
- 反向遍歷父指標以重建對話順序。
- 處理分支 — 當你編輯提示詞時,ChatGPT 會在樹中建立新的分支,因此一段對話可能有多條路徑。
- 從巢狀陣列中提取文字 — 訊息內容深埋在
content.parts[]陣列中,而非簡單的字串。 - 轉換 Unix 時間戳記 — 時間儲存為浮點數(例如
1713350400.0),而非人類可讀的格式。 - 應對格式變更 — 社群成員反映格式隨時間不斷變化,Canvas、網頁搜尋和圖片生成等新功能增加了額外的複雜性。
優點: 所有歷史記錄集中在一個檔案;官方匯出;無需第三方工具。
缺點: 最長需等待 24 小時;深度巢狀樹狀結構需要大量解析工作;不支援選擇性匯出;會匯出所有對話,包括你可能不需要的;無法即時匯出。
3.3 瀏覽器開發者工具(手動)
適合想要快速擷取原始 API 資料的技術使用者:
- 在瀏覽器中開啟開發者工具(
F12)。 - 前往 Network 分頁。
- 瀏覽或重新整理 ChatGPT 對話。
- 以
conversation或backend-api過濾請求。 - 找到包含對話資料的回應。
- 右鍵點擊 → Copy response,貼上到
.json檔案中。
優點: 無需任何工具;取得原始 API 格式;即時。
缺點: 需要技術知識;處理多段對話時非常繁瑣;格式因 API 端點而異;匯出之間無一致結構;容易擷取到不完整的資料。
4. 方法比較
| 功能 | ChatGPT Exporter | 官方資料匯出 | 瀏覽器開發者工具 |
|---|---|---|---|
| 安裝難度 | 低(Chrome 擴充功能) | 無需安裝 | 無需安裝(需技術能力) |
| 匯出速度 | 即時(一鍵完成) | 數分鐘到 24 小時 | 每次手動操作 |
| JSON 結構 | 乾淨、扁平陣列 | 巢狀樹狀 | 原始 API 格式 |
| 選擇性匯出 | 支援(按訊息選擇) | 不支援(所有對話) | 按對話逐一操作 |
| 按對話匯出 | 支援 | 不支援(單一批次檔案) | 支援(手動) |
| 包含中繼資料 | 支援(可自訂) | 支援 | 支援(原始格式) |
| Deep Research 引用 | 支援 | 部分支援 | 支援(原始格式) |
| 思維過程(o1/o3) | 支援 | 部分支援 | 視情況而定 |
| 網頁搜尋來源 | 支援 | 部分支援 | 視情況而定 |
| Canvas 成品 | 支援 | 不支援 | 視情況而定 |
| 時間戳記格式 | 可自訂 | Unix 浮點數 | 視情況而定 |
| 複製到剪貼簿 | 支援 | 不支援 | 支援(手動) |
| 可直接用於腳本 | 支援 | 需要解析 | 需要解析 |
| 從介面即時匯出 | 支援 | 不支援 | 支援 |
5. 匯出的 JSON 可以做什麼:8 個實用範例
以下所有範例使用 ChatGPT Exporter 的 JSON 格式(包含 role、say 和 time 欄位)。如果你使用的是 OpenAI 的官方匯出,需要先從 mapping 樹中提取訊息。
5.1 使用 Python 分析對話
將匯出的 JSON 載入 Python 進行快速分析:
import json
from collections import Counter
with open("ChatGPT-my-conversation.json") as f:
data = json.load(f)
# Count messages by role
roles = Counter(msg["role"] for msg in data["messages"])
print(f"Your prompts: {roles.get('Prompt', 0)}")
print(f"AI responses: {roles.get('Response', 0)}")
# Find longest response (skip unselected messages with empty "say")
responses = [m for m in data["messages"] if m["role"] == "Response" and m["say"]]
longest = max(responses, key=lambda m: len(m["say"]))
print(f"Longest response: {len(longest['say'])} chars")
# Average response length
avg = sum(len(m["say"]) for m in responses) // len(responses)
print(f"Average response: {avg} chars")5.2 提取所有程式碼區塊
從 AI 回覆中提取每個程式碼區塊 — 適合建立個人程式碼片段庫:
import json
import re
with open("ChatGPT-my-conversation.json") as f:
data = json.load(f)
for msg in data["messages"]:
if msg["role"] == "Response" and msg["say"]:
blocks = re.findall(r"```(\w+)?\n(.*?)```", msg["say"], re.DOTALL)
for lang, code in blocks:
print(f"--- {lang or 'text'} ---")
print(code)5.3 轉換為 CSV 供試算表使用
將 JSON 轉換為 CSV,方便在 Excel 或 Google Sheets 中分析:
import json
import csv
with open("ChatGPT-my-conversation.json") as f:
data = json.load(f)
with open("conversation.csv", "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["Role", "Content", "Time", "Word Count"])
for msg in data["messages"]:
if msg["say"]: # skip unselected messages
writer.writerow([
msg["role"],
msg["say"],
msg.get("time", ""),
len(msg["say"].split())
])5.4 建立微調資料集
將匯出的對話轉換為 OpenAI 微調格式(JSONL)。role 值需要從 ChatGPT Exporter 格式(Prompt/Response)對應到 API 格式(user/assistant):
import json
ROLE_MAP = {"Prompt": "user", "Response": "assistant"}
with open("ChatGPT-my-conversation.json") as f:
data = json.load(f)
# Convert to OpenAI fine-tuning format
training_data = []
messages = [m for m in data["messages"] if m["say"]] # skip empty
for i in range(0, len(messages) - 1, 2):
if messages[i]["role"] == "Prompt" and messages[i+1]["role"] == "Response":
training_data.append({
"messages": [
{"role": "user", "content": messages[i]["say"]},
{"role": "assistant", "content": messages[i+1]["say"]}
]
})
with open("training.jsonl", "w") as f:
for item in training_data:
f.write(json.dumps(item) + "\n")
print(f"Created {len(training_data)} training examples")5.5 使用 jq 進行命令列處理
使用 jq 進行即時命令列分析,無需撰寫程式碼:
# Count total messages
jq '.messages | length' ChatGPT-my-conversation.json
# Get all your prompts (non-empty only)
jq -r '.messages[] | select(.role == "Prompt" and .say != "") | .say' ChatGPT-my-conversation.json
# Show conversation title and message count
jq '{title: .metadata.title, messages: (.messages | length)}' ChatGPT-my-conversation.json
# Count messages by role
jq '[.messages[].role] | group_by(.) | map({(.[0]): length}) | add' ChatGPT-my-conversation.json
# Word count per AI response
jq '.messages[] | select(.role == "Response" and .say != "") | {words: (.say | split(" ") | length)}' ChatGPT-my-conversation.json5.6 匯入 SQLite
將對話資料載入 SQLite 資料庫,以便進行 SQL 查詢:
import json
import sqlite3
with open("ChatGPT-my-conversation.json") as f:
data = json.load(f)
conn = sqlite3.connect("chatgpt.db")
conn.execute("""
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY,
role TEXT,
content TEXT,
time TEXT,
word_count INTEGER
)
""")
for msg in data["messages"]:
if msg["say"]: # skip unselected messages
conn.execute(
"INSERT INTO messages (role, content, time, word_count) VALUES (?, ?, ?, ?)",
(msg["role"], msg["say"], msg.get("time", ""), len(msg["say"].split()))
)
conn.commit()
print(f"Imported {sum(1 for m in data['messages'] if m['say'])} messages into chatgpt.db")然後用 SQL 查詢:
-- Message stats by role
SELECT role, COUNT(*) as count, AVG(word_count) as avg_words
FROM messages GROUP BY role;
-- Full-text search across all messages
SELECT role, content FROM messages WHERE content LIKE '%repository pattern%';5.7 提供給其他 AI 工具使用
將 ChatGPT 對話匯出為 JSON,交給另一個 AI 進行結構化分析:
- 載入 Claude 或 Gemini,以不同角度審視同一段對話。
- 作為 AI 驅動的摘要、翻譯或情感分析管線的輸入。
- 匯入 LangChain 或 LlamaIndex,用於建立檢索增強生成(RAG)系統。
JSON 保留了精確的結構和角色標籤,是 AI 之間程式化工作流程的理想格式 — 不像 PDF 在被讀取時會遺失結構。
5.8 建立版本控制的備份
將匯出的 JSON 檔案儲存到 Git 儲存庫,實現版本控制的備份:
mkdir chatgpt-archive && cd chatgpt-archive
git init
# After each export, add and commit
git add ChatGPT-python-api-design.json
git commit -m "Export: Python API Design conversation"這讓你擁有完整的匯出歷史記錄,包含差異比對、時間戳記和還原任何版本的能力。
6. JSON 與其他匯出格式比較
| 功能 | JSON | Markdown | TXT | CSV | |
|---|---|---|---|---|---|
| 機器可讀 | 是 | 部分 | 否 | 否 | 是 |
| 人類可讀 | 中等 | 是 | 是 | 是 | 是 |
| 保留結構 | 完整(巢狀) | 部分 | 僅視覺 | 否 | 僅扁平 |
| 保留中繼資料 | 是 | 可選 | 否 | 否 | 可選 |
| 匯出後可編輯 | 是 | 是 | 否 | 是 | 是 |
| 可程式化處理 | 是 | 部分 | 否 | 否 | 是 |
| 適配筆記應用 | 否 | 是 | 有限 | 是 | 否 |
| 檔案大小 | 中等 | 小 | 大 | 小 | 小 |
| 適合版本控制 | 是 | 是 | 否 | 是 | 是 |
| 適合資料分析 | 是 | 否 | 否 | 否 | 是 |
何時使用各種格式:
- JSON — 當你計畫分析、轉換或以程式化方式處理對話時。最適合開發者、資料分析師和自動化工作流程。
- Markdown — 當你想要閱讀、編輯或將對話整合到知識管理工具(Obsidian、Notion、GitHub)中時。
- PDF — 當你需要與不使用技術工具的人分享格式化文件時。
7. 最佳化 JSON 匯出的技巧
7.1 使用選擇性匯出取得更乾淨的資料
當你只需要特定交流時,不要匯出整段對話。使用 ChatGPT Exporter 的選擇功能,只勾選相關訊息 — 未選中的訊息仍會出現在 JSON 中(以保留對話結構),但 say 欄位為空,在程式碼中很容易過濾掉:[m for m in data["messages"] if m["say"]]。
7.2 驗證你的 JSON
匯出後,在處理之前確認檔案格式正確:
# Using jq (install: brew install jq / apt install jq)
jq . ChatGPT-my-conversation.json > /dev/null && echo "Valid JSON"
# Using Python (no install needed)
python3 -m json.tool ChatGPT-my-conversation.json > /dev/null && echo "Valid JSON"7.3 在撰寫程式碼之前先用 jq
在撰寫完整的 Python 腳本之前,先用 jq 互動式探索你的資料:
# Pretty-print to understand the structure
jq '.' ChatGPT-my-conversation.json | head -30
# Quick look at metadata
jq '.metadata' ChatGPT-my-conversation.json
# Count messages by role
jq '[.messages[].role] | group_by(.) | map({(.[0]): length}) | add' ChatGPT-my-conversation.json7.4 合併多次匯出
如果你分別匯出了多段對話,可以將它們合併為單一資料集:
import json
import glob
all_conversations = []
for file in sorted(glob.glob("ChatGPT-*.json")):
with open(file) as f:
conv = json.load(f)
all_conversations.append({
"title": conv["metadata"]["title"],
"exported": conv["metadata"]["dates"]["exported"],
"messages": [m for m in conv["messages"] if m["say"]]
})
with open("all-conversations.json", "w") as f:
json.dump(all_conversations, f, indent=2, ensure_ascii=False)
print(f"Merged {len(all_conversations)} conversations")7.5 保持中繼資料開啟
ChatGPT Exporter 在 JSON 輸出中包含中繼資料(標題、時間戳記、使用者資訊、對話連結)。建議保持這些欄位開啟 — 當你累積了數十個檔案時,它們對於排序、篩選和組織匯出結果至關重要。dates.exported 欄位特別適合用於追蹤每次備份的時間。
8. 常見問題
Q1:ChatGPT 能原生匯出 JSON 嗎?
可以 — 但僅限於批次資料匯出(Settings → Data Controls → Export Data),會將所有對話匯出到單一檔案中,且結構為複雜的巢狀格式。若需按對話匯出乾淨、扁平結構的 JSON,請使用 ChatGPT Exporter。
Q2:ChatGPT Exporter 的 JSON 和 OpenAI 官方匯出有什麼差別?
ChatGPT Exporter 產生包含 metadata 和 messages 的扁平結構 — 每條訊息有 role("Prompt" / "Response")和 say(文字內容),可直接在迴圈中迭代。OpenAI 的匯出使用基於樹狀的 mapping,包含父子引用、內容深埋在 parts[] 陣列中,以及 Unix 浮點時間戳記,需要大量解析工作。詳細比較請參閱第 3 節。
Q3:可以將 JSON 匯出轉換為其他格式嗎?
可以 — JSON 是最通用的起點。你可以將其轉換為 CSV(第 5.3 節)、用於微調的 JSONL(第 5.4 節)、SQL 資料庫(第 5.6 節),或透過簡短的腳本轉換為任何其他格式。
Q4:JSON 匯出檔案有多大?
一段典型對話(50-100 條訊息)產生的 JSON 檔案約 50-200 KB。包含程式碼區塊的長對話可能達 500 KB 以上。這比 Markdown 或 TXT 稍大,但遠小於 PDF。
Q5:Deep Research 報告會包含在 JSON 匯出中嗎?
會的。ChatGPT Exporter 會擷取完整的 Deep Research 報告,包括引用註腳和來源 URL。這是 ChatGPT Exporter 的獨家功能 — OpenAI 的官方匯出和其他工具無法完整保留 Deep Research 資料。
Q6:程式碼區塊會在 JSON 中保留嗎?
會的。內容處理管線會將程式碼區塊轉換為純文字,同時保留語言標識符和完整的程式碼內容。你可以使用正規表達式以程式方式提取 — 請參閱第 5.2 節的實際範例。
Q7:JSON 匯出功能免費嗎?
是的,JSON 匯出在 ChatGPT Exporter 的免費版本中即可使用。無需帳號或訂閱。
Q8:能只匯出 AI 回覆而不包含我的提示詞嗎?
可以。點擊 Select 並選擇 Answers 即可僅選擇 ChatGPT 的回覆。你也可以手動勾選/取消勾選個別訊息。未選中的訊息仍會出現在 JSON 中以保留結構上下文,但 say 欄位為空 — 在程式碼中很容易過濾掉。
Q9:匯出的 JSON 可以搭配 OpenAI API 使用嗎?
可以,只需簡單的角色對應。ChatGPT Exporter 使用 "Prompt" 和 "Response" 作為角色標籤,而 API 使用 "user" 和 "assistant"。用字典對應即可:{"Prompt": "user", "Response": "assistant"}。完整的微調轉換範例請參閱第 5.4 節。
Q10:支援群組對話嗎?
支援。對於群組聊天(ChatGPT 的 /gg/ 路徑),角色標籤會自動切換為 "Human" 和 "ChatGPT",取代 "Prompt" / "Response"。所有參與者的訊息都會以相同的中繼資料和設定保留。
9. 總結
JSON 是 ChatGPT 匯出的進階使用者格式。當你需要分析對話模式、提取程式碼區塊、建立訓練資料集或自動化資料工作流程時,JSON 提供完整的結構化資料來實現 — 不像 PDF 或純文字,它們將資料鎖定在僅供人類閱讀的格式中。
雖然 OpenAI 的官方資料匯出提供 JSON,但其複雜的巢狀結構和長達數小時的等待時間使其不適合日常使用。ChatGPT Exporter 讓你一鍵取得乾淨、結構良好的 JSON — 扁平的 metadata + messages 格式、選擇性匯出、可自訂中繼資料,以及其他工具無法擷取的 AI 專屬功能(Deep Research 引用、o1/o3 推理、網頁搜尋來源)。
立即開始使用: