JSONの圧縮
空白を1バイトも残さず削り、削減量を正確に表示します。
貼り付けたものがブラウザの外に出ることはありません。 connect-src の許可リストにより、これは約束ではなくブラウザによる保証になっています。 自分で確かめる
圧縮は、パーサーが無視する空白をすべて取り除きます。改行、インデント、コロンのあとのスペース。それ以外は何も変わらず、パースした結果は完全に同じです。
一般的な整形済みAPIペイロードなら、これでバイト数の10〜20パーセントが減ります。4スペースで整形された深いネストのドキュメントでは、3分の1を超えることもあります。
効く場面と効かない場面
大量に保存・送信されるものには圧縮の価値があります。APIレスポンス、バンドルに埋め込む設定、キューに積むレコード、カラムストアの行などです。
HTTP越しでは、多くの人が思うほどの効果はありません。gzipやbrotliが繰り返しの空白をすでに非常によく圧縮するからです。gzip済みのレスポンスをさらに圧縮しても、節約できるのはたいてい数パーセントで、20パーセントではありません。効くのは圧縮がかからない場所です。ローカルストレージ、データベースのカラム、サイズ上限の厳しいメッセージ本文、ログ1行など。
人が読むファイルにはまったく価値がありません。圧縮されたJSONは巨大な1行であり、そこに対する差分はファイル全体の書き換えになります。
圧縮がやらないこと
キー名を短くしたり、null値を落としたり、並び替えたり、数値を変えたりはしません。それらは書式ではなくデータそのものの変換であり、黙ってやる圧縮ツールは危険です。
とくに数値は元のテキストのまま残ります。JSON.parseの上に作られた圧縮ツールなら1.50は1.5に、1e3は1000になります。確かに短くなりますが、それは別のドキュメントです。
How to do this in code
コードで圧縮する方法です。
js JavaScript
const min = JSON.stringify(JSON.parse(text));
// Note this also normalises numbers: 1.50 becomes 1.5. py Python
json.dumpsの区切り文字は既定で", "と": "なので、素朴に呼び出しただけでは実際には圧縮されていません。
import json
# The separators argument is the part people miss: without it
# Python leaves a space after every comma and colon.
min_text = json.dumps(json.loads(text), separators=(',', ':')) sh jq
jq -c . input.json > output.min.json go Go
var buf bytes.Buffer
if err := json.Compact(&buf, data); err != nil {
return err
}
// Compact works on bytes, so numbers are untouched. よくある質問
- 実際どのくらい減りますか?
- このツールは、あなたのドキュメントについて前後のバイト数を表示します。目安として、スペース2個で整形されたJSONの10〜20パーセントが空白で、4個ならそれ以上です。gzipが効いた通信路では、圧縮がすでに繰り返しをうまく扱うため、実際の削減はずっと小さくなります。
- 圧縮したJSONは有効なままですか?
- はい。トークン間の空白は意味を持たないため、圧縮したドキュメントと整形したドキュメントはまったく同じ値にパースされます。
- リポジトリ内のJSONは圧縮すべきですか?
- いいえ。バージョン管理は人が差分を読むためのものであり、圧縮されたファイルではどんな変更もファイル全体の書き換えに見えてしまいます。圧縮はビルド時か送信時に行ってください。