絕大多數JSON序列化工具只提供兩種選擇:
- 緊湊的機器輸出:
{"a":{"b":{"c":"abc"}},"x":{"y":{"z":"xyz"}}}
- 或完全展開的“美化輸出”:
{
"a": {
"b": {
"c": "abc"
}
},
"x": {
"y": {
"z": "xyz"
}
}
}
我想要一種折衷的方案:第一種對人類來說難以掃描,而第二種在實際嵌套數據上會變得極其冗長.
這個想法
我寫了一個名為jsonfold的小型 Python 模塊。它不是用來替換 Python 的 JSON 序列化器,而是在json.dump()輸出之上作為一個輕量級的後處理濾鏡.
格式化器選擇性地:
- 將小容器摺疊到同一行上,
- 打包短整數序列,
- 保持大或複雜結構展開。
範例輸出:
{
"a": { "b": { "c": "abc" } },
"x": { "y": { "z": "xyz" } }
}
為何採用這種方法?
我不想重新建立一個序列化器 - 有很多好的序列化器(包括內建的json.dump()) 可以高效處理從簡單數據結構 (list/dict) 到自訂類別和 Python@dataclass物件,執行變換並自訂輸出佈局。
有趣的是,格式化器會不重新解析 JSON 流。它作為一個串流包裝器,包圍著類似檔案的物件:
json.dump(obj, JSONFoldWriter(fp), indent=2)
這意味著它可以在固定記憶體使用量和線性處理時間的情況下處理大型文件。這種方法適用於大多數現有的序列化器。它還為json.dump()、json.dumps()提供封裝器。
from jsonfold import dumps
data = {
"a": {"b": {"c": "abc"}},
"x": {"y": {"z": "xyz"}},
}
print(dumps(data))
自定義
格式化工具允許控制:
- 最大行寬、
- 摺疊深度、
- 壓縮侵略性、
- 陣列/物件限制。
所以你可以選擇保守的格式化或更侵略性的壓縮。
全文:
中等(無付費牆):一個與現有序列化器兼容的流式 JSON 格式化工具
極少使用
拉jsonfold.py來自GitHub專案
import jsonfold
import sys
data = {
"meta": {"version": 1, "ok": True},
"ids": [1, 2, 3, 4, 5],
"items": [{"id": 1, "name": "alpha"}, {"id": 2, "name": "beta"}],
}
# compact can be: default, low, med, high, max
jsonfold.dump(data, sys.stdout, compact="default")
GitHub 專案
倉儲庫:https://github.com/yairlenga/jsonfold
Python 的實現正在python 目錄.
未來的文章將涵蓋其他實現:JavaScript、Java、C、... - 請關注 GitHub 專案,或追蹤 Medium 上的文章。












