JSONシリアライザはほとんどの場合、あなたに二つの選択肢しか与えません:
- コンパクトな機械出力:
{"a":{"b":{"c":"abc"}},"x":{"y":{"z":"xyz"}}}
- または完全に展開された「きれいに整形された」出力:
{
"a": {
"b": {
"c": "abc"
}
},
"x": {
"y": {
"z": "xyz"
}
}
}
中間のものが欲しかった:最初のものは人間がスキャンするのが難しく、二番目は実際のネストされたデータで非常に冗長になる
アイデア
私はjsonfoldという小さなPythonモジュールを書いた。PythonのJSONシリアライザを置き換える代わりに、json.dump()の出力の上で軽量なポストプロセスフィルタとして動作する
フォーマッタは選択的に:
- 小さなコンテナを1行に折りたたみ、
- 短いスカラーシーケンスを詰め込み、
- 大きなまたは複雑な構造を展開したままにします.
出力例:
{
"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プロジェクト リポジトリ:
__JHSNS_URL_0____JHSNS_SEG_1102def4_55__Pythonの実装は以下にありますpython ディレクトリ.
今後の記事では他の実装について取り上げます:JavaScript、Java、C、... - GitHub プロジェクトをフォローするか、Medium で記事をフォローしてください。












