如何第一時間看到新文章?
收藏本部落格列表頁,並在首頁與工具聚合頁留意指南入口。閱讀文章無需註冊或訂閱電子報。
整理 Python JSON 實務中的關鍵技巧:自訂 datetime 編碼、以 ensure_ascii=False 保留多語可讀性、串流讀取 GB 級資料,以及 orjson/ujson 的選型建議。
在 Python 後端與資料流程中,JSON 幾乎是預設交換格式。看似簡單的 json.dumps() / json.loads(),在遇到 datetime、多語字元與大型檔案時,常會暴露可維護性與效能問題。
本篇聚焦在可直接套用到實務的做法:
loads/dumps 與 load/dump 的使用邊界datetime 無法序列化的穩定解法ensure_ascii=False 的多語輸出策略json、orjson、ujson 的取捨loads/dumps 與 load/dumpjson.dumps(obj):Python 物件 -> JSON 字串json.loads(text):JSON 字串 -> Python 物件json.dump(obj, file):Python 物件 -> 寫入檔案json.load(file):檔案 -> Python 物件簡單記憶:有 s 代表 string。
datetime 序列化錯誤常見錯誤如下:
from datetime import datetime
import json
json.dumps({"now": datetime.now()})
# TypeError: Object of type datetime is not JSON serializable建議用自訂 Encoder 統一轉換規則:
from datetime import datetime, date
import json
class DateTimeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, date):
return obj.isoformat()
return super().default(obj)
payload = {"now": datetime.now(), "today": date.today()}
print(json.dumps(payload, cls=DateTimeEncoder, ensure_ascii=False, indent=2))若你需要固定格式(例如 YYYY-MM-DD HH:MM:SS),可改用 strftime(...)。
\uXXXX預設情況下,json.dumps() 會跳脫非 ASCII 字元:
import json
print(json.dumps({"message": "你好,世界"}))
# {"message": "\u4f60\u597d\uff0c\u4e16\u754c"}要保留可讀文字:
import json
print(json.dumps({"message": "你好,世界"}, ensure_ascii=False))寫檔時請搭配 UTF-8:
with open("data.json", "w", encoding="utf-8") as f:
json.dump({"message": "你好,世界"}, f, ensure_ascii=False)若用 json.load() 一次讀完整個大陣列,容易造成記憶體壓力。實務上建議兩條路徑:
.jsonl)import json
def read_jsonl(path):
with open(path, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if line:
yield json.loads(line)
for obj in read_jsonl("events.jsonl"):
passijsonpip install ijsonimport ijson
def iter_huge_array(path):
with open(path, "rb") as f:
for item in ijson.items(f, "item"):
yield itemjson / orjson / ujson 如何選json(標準函式庫):相容性高、零額外相依orjson:效能敏感路徑通常更有優勢ujson:替換成本低,但仍需驗證邊界行為orjson 最小範例:
import orjson
from datetime import datetime
data = {"name": "Alice", "now": datetime.now()}
raw = orjson.dumps(data) # bytes
obj = orjson.loads(raw)loads/dumps,檔案用 load/dumpensure_ascii=False所有工具都在瀏覽器本地執行,資料不會上傳伺服器。
致力於為開發者提供最佳的 JSON 處理工具
更多文章即將發布...
返回部落格關於跟進更新、選題與互動方式。
收藏本部落格列表頁,並在首頁與工具聚合頁留意指南入口。閱讀文章無需註冊或訂閱電子報。
圍繞 JSON 驗證、格式化、轉換與除錯流程,以及 JSON Work 工具更新,與站內工具的本地能力互相呼應。
可以。請透過關於頁的聯絡方式或 GitHub 回饋;我們會優先安排貼近真實開發情境的教學。