博客ChatGPT 匯出 JSON — 將對話轉為結構化資料(2026)

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。

使用方法:

  1. 從 Chrome Web Store 安裝 ChatGPT Exporter
  2. 開啟任意 ChatGPT 對話(一般對話或群組聊天均可)。
  3. 點擊 Select 按鈕選擇要匯出的訊息(全部、僅提示詞、僅回覆,或手動勾選/取消勾選個別訊息)。
  4. 點擊 Export 並選擇 JSON 格式。
  5. .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 中的每個欄位都可以在設定中個別開關:

欄位類型說明可設定項
titlestring對話標題可在設定中開關
user.namestring你的顯示名稱可獨立開關
user.emailstring你的電子郵件地址可獨立開關
dates.createdstring對話建立時間可選擇要包含哪些日期
dates.updatedstring最後一條訊息的時間可選擇要包含哪些日期
dates.exportedstring匯出建立的時間可選擇要包含哪些日期
linkstring原始對話的 URL可在設定中開關

日期和時間格式也可以自訂:日期可選擇月/日/年、日/月/年或年/月/日,時間可選擇隱藏、12 小時制或 24 小時制。

訊息欄位

欄位類型說明
rolestring"Prompt"(你的訊息)或 "Response"(ChatGPT 的回覆)。在群組聊天中:"Human""ChatGPT"
saystring訊息內容(純文字)。如果某條訊息未被選中匯出,則為空字串 ""(該訊息仍會出現以保留對話結構)
timestring訊息時間戳記(需在設定中啟用「逐條訊息時間戳記」選項)

內容處理

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 提供內建的資料匯出方式

  1. ChatGPT 中前往 Settings → Data Controls → Export Data
  2. 等待包含 ZIP 檔案的電子郵件(通常只需幾分鐘,但最長可能需要 24 小時)。
  3. 解壓後找到 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 開發者社群中廣泛討論的,這種樹狀結構要求你:

  1. 反向遍歷父指標以重建對話順序。
  2. 處理分支 — 當你編輯提示詞時,ChatGPT 會在樹中建立新的分支,因此一段對話可能有多條路徑。
  3. 從巢狀陣列中提取文字 — 訊息內容深埋在 content.parts[] 陣列中,而非簡單的字串。
  4. 轉換 Unix 時間戳記 — 時間儲存為浮點數(例如 1713350400.0),而非人類可讀的格式。
  5. 應對格式變更 — 社群成員反映格式隨時間不斷變化,Canvas、網頁搜尋和圖片生成等新功能增加了額外的複雜性。

優點: 所有歷史記錄集中在一個檔案;官方匯出;無需第三方工具。

缺點: 最長需等待 24 小時;深度巢狀樹狀結構需要大量解析工作;不支援選擇性匯出;會匯出所有對話,包括你可能不需要的;無法即時匯出。

3.3 瀏覽器開發者工具(手動)

適合想要快速擷取原始 API 資料的技術使用者:

  1. 在瀏覽器中開啟開發者工具(F12)。
  2. 前往 Network 分頁。
  3. 瀏覽或重新整理 ChatGPT 對話。
  4. conversationbackend-api 過濾請求。
  5. 找到包含對話資料的回應。
  6. 右鍵點擊 → Copy response,貼上到 .json 檔案中。

優點: 無需任何工具;取得原始 API 格式;即時。

缺點: 需要技術知識;處理多段對話時非常繁瑣;格式因 API 端點而異;匯出之間無一致結構;容易擷取到不完整的資料。


4. 方法比較

功能ChatGPT Exporter官方資料匯出瀏覽器開發者工具
安裝難度低(Chrome 擴充功能)無需安裝無需安裝(需技術能力)
匯出速度即時(一鍵完成)數分鐘到 24 小時每次手動操作
JSON 結構乾淨、扁平陣列巢狀樹狀原始 API 格式
選擇性匯出支援(按訊息選擇)不支援(所有對話)按對話逐一操作
按對話匯出支援不支援(單一批次檔案)支援(手動)
包含中繼資料支援(可自訂)支援支援(原始格式)
Deep Research 引用支援部分支援支援(原始格式)
思維過程(o1/o3)支援部分支援視情況而定
網頁搜尋來源支援部分支援視情況而定
Canvas 成品支援不支援視情況而定
時間戳記格式可自訂Unix 浮點數視情況而定
複製到剪貼簿支援不支援支援(手動)
可直接用於腳本支援需要解析需要解析
從介面即時匯出支援不支援支援

5. 匯出的 JSON 可以做什麼:8 個實用範例

以下所有範例使用 ChatGPT Exporter 的 JSON 格式(包含 rolesaytime 欄位)。如果你使用的是 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.json

5.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 進行結構化分析:

  • 載入 ClaudeGemini,以不同角度審視同一段對話。
  • 作為 AI 驅動的摘要、翻譯或情感分析管線的輸入。
  • 匯入 LangChainLlamaIndex,用於建立檢索增強生成(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 與其他匯出格式比較

功能JSONMarkdownPDFTXTCSV
機器可讀部分
人類可讀中等
保留結構完整(巢狀)部分僅視覺僅扁平
保留中繼資料可選可選
匯出後可編輯
可程式化處理部分
適配筆記應用有限
檔案大小中等
適合版本控制
適合資料分析

何時使用各種格式:

  • 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.json

7.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 產生包含 metadatamessages 的扁平結構 — 每條訊息有 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 推理、網頁搜尋來源)。

立即開始使用: