日本語

開発者ツール · JSON フォーマッタおよびバリデータ

JSON 整形印刷の仕組み: インデント、空白、キーの順序

· 仕組み

json 開発者ワークフロー 検証

JSON の整形印刷の仕組み: JSON トークンと正確な検証境界で示されるインデント、空白、およびキーの順序
オリジナル ToolAcre ベクトル イラスト

プリティプリントはわずかな空白を変更するだけですが、人々はそれによってデータが変更されるのではないかと心配しています。この記事では、フォーマッタが何をタッチできるのか、インデントの深さがどのように適用されるのか、キーの順序はどうなるのかについて説明します。

同じデータ、3 つの異なる外観

同じデータ、3 つの異なる外観 - コンパクトな API ペイロードは 1 行を占有することも、深さごとに 2 つのスペースで拡張することも、4 つでさらに拡張することもできます。中括弧、括弧、名前、および値は、すべてのバージョンで同じ解析された構造を表します。改行と構造トークン間の間隔のみが異なります。この違いは、フォーマッタの出力を確認するときに重要です。インデントにより、結果の値はそのままで多くのバイトが意図的に変更されるため、差分が大きくなっても自動的にデータが変更されるわけではありません。

ToolAcre は 2、4、または 8 個のスペースとタブを提供し、選択したインデントを JSON.stringify に渡します。短いネストされたデプロイメント レコードにより、比較が明確になります。リージョンは同じ配列順序のままで、ブール値はブール値のまま、再試行回数は数値のままです。

JSON が重要ではないとみなす空白はどれですか

JSON が重要ではないとみなす空白文字 — RFC 8259 では、構造文字の前後にスペース、水平タブ、改行、復帰を許可します。したがって、フォーマッタは、値を変更せずに、`{` の後に改行を配置し、ネストされたメンバーの前にスペースを配置し、`}` の前に別の改行を配置する可能性があります。ただし、空白は普遍的に使い捨てできるわけではありません。二重引用符で文字列が開かれると、通常のスペースはすべてその文字列の内容に属し、フォーマットされてもデータとして正確に存続する必要があります。

最も安全なメンタル モデルは、トークンの境界を文字列の内容から分離することです。コロンと数字の間には、追加で許可される空白が表示されます。引用されたメッセージの文字の間にあるのは情報です。 ToolAcre は最初にソースを解析し、結果の値をシリアル化するため、JSON.stringify はデコードされた文字列文字を保持しながら、コンテナーの周囲に新しい空白を選択します。

インデント設定の適用方法

インデント設定の適用方法 — ネストされたコンテナーごとに、選択したインデント単位のコピーが 1 つ追加されます。トップレベルのプロパティは 1 レベル目から始まります。オブジェクト内のプロパティは 2 レベルから始まります。配列内のオブジェクトは別のレベルを追加します。閉じ中括弧と閉じ括弧は、それらを所有するコンテナーのインデントに戻ります。したがって、幅はキー、値、または前の行の長さではなく、構造の深さを反映します。

スペースはすべてのエディターで固定の視覚的な幅を作成しますが、タブを使用すると、各ビューアが 1 つのレベルの表示幅を選択できます。また、JavaScript では JSON.stringify インデントを 10 個のスペース文字または指定された文字列の最初の 10 文字に制限していますが、ToolAcre は実用的なプリセットのみを公開しています。

書式設定によりキーの順序は変わりますか?

書式設定によりキーの順序は変わりますか? — 通常の整形印刷では、オブジェクトのメンバーを意図的にソートしません。 JSON オブジェクトは概念的には順序のないコレクションですが、JavaScript の解析とシリアル化では、定義されたプロパティ列挙ルールが使用されます。したがって、ほとんどの非整数キーは入力順序に従って出現しますが、整数のようなキーは他の名前より前に出現する可能性があります。たとえフォーマッタが見慣れたオブジェクトに対して一貫して保持しているように見える場合でも、消費者はメンバーの位置にビジネス上の意味を決して関連付けるべきではありません。

ToolAcre はインデントと並べ替えを分離します。並べ替えを無効にすると、解析されたオブジェクトが直接シリアル化されます。並べ替えを有効にすると、JSON.stringify が実行される前にキーがアルファベット順に並べられたオブジェクトが再帰的に構築されます。配列の順序を変更すると意味が変わってしまうため、配列では要素の順序が維持されます。この明示的なオプションにより、レビュー可能な区別が行われます。空白のみの出力はきれいな印刷から得られるのに対し、キー順序の差分は正規の編成の要求から得られます。

解析および再シリアル化フォーマッタで何が変わるか

解析および再シリアル化フォーマッタが変更できる内容 — 解析された値は残りますが、元のスペルは残りません。 `1.0` として書き込まれた数値は `1` として返される場合があり、`1e3` は `1000` として返される場合があります。エスケープされた印刷可能文字は文字通り再表示できますが、シリアル化が必要な場合はリテラル文字をエスケープできます。重複したオブジェクト名は解析中にすでに折りたたまれているため、フォーマッタが使用できるのは最終的なプロパティ値のみです。

これらの変換は、書式設定された出力をバイトを保持するドキュメント エディタとして扱うべきではない理由を説明しています。意味上の等価性が目標の場合は解析された値を比較し、元の表記法が署名、ハッシュ、または監査のワークフローにとって重要な場合はテキストの差分を検査します。 JavaScript の数値はシリアル化する前に精度が失われる可能性があるため、非常に大きな整数には特に注意が必要です。

作業例: ネストされたオブジェクトのフォーマット

作業例: ネストされたオブジェクトのフォーマット — `{"service":{"regions":["sg","us"],"retry":{"count":3}}}` で開始し、2 つのスペースを選択します。開始ルート中括弧の後には改行が続きます。 `service` は先頭に 2 つのスペースを受け取り、その子プロパティは 4 つ、配列要素は 6 つを受け取り、ネストされた `count` プロパティも 6 つを受け取ります。各カンマは 1 つのレンダリングされたメンバーを終了し、各終了デリミタはその開始コンテナのインデント レベルと一致します。

同じ値をタブに切り替えると、各レベルで使用されるプレフィックスのみが変更されます。キーの並べ替えをオンにすると、さらに `regions` を `retry` の前に配置できますが、配列では依然として `sg` の次に `us` が読み取られます。有用なレビューでは、出力を 2 つのパスでチェックします。まず、ネストと配列の順序が元の値を表していることを確認し、次に、選択した空白がリポジトリに適合するかどうかを判断します。

これでカバーされない内容

これで説明されないこと — キーの並べ替えは別の正規化の選択であり、縮小化は反対のプレゼンテーション操作です。また、プリティプリントでは、配列の順序を変更する権限が付与されることはありません。配列の位置はデータであるため、それを変更すると、優先順位、順序、またはプログラムの動作が変更される可能性があります。また、インデントによって、解析前に無効なソースが有効になることもありません。コメント、末尾のカンマ、および JavaScript のみの値は、厳密な JSON フォーマッタでシリアル化する前に、実際の形式に合わせてパーサーによって修正または処理される必要があります。

正規の JSON スキームは、正確なメンバーの順序付け、数値のスペル、署名または決定論的ハッシュのエスケープを定義することで、通常の書式設定よりもさらに進んでいます。 ToolAcre は、そのような正規化標準の実装を主張していません。 JSON.parse と JSON.stringify を使用し、オプションの再帰キー ソートを使用して、読み取り可能なブラウザー ローカル出力を生成します。

要点: 整形印刷は空白の変換です

要点: プリティプリントは空白の変換です。その目的は、表現された値を変更せずに構造を公開することです。インデントの幅は、JSON の有効性ではなく、読みやすさ、レビューのノイズ、およびローカルの規則に影響します。文字列内の空白はデータのままであり、配列の順序は重要なままであり、オブジェクトキーの並べ替えには個別の明示的な選択が必要です。これらの境界を覚えておくと、フォーマッタの差分を評価しやすくなり、表面的な変更がセマンティックな編集と混同されるのを防ぐことができます。

解析および再シリアル化ツールは、元のトークン テキストではなく値から機能するため、数値を正規化したりスペルをエスケープしたりできます。字句の忠実度が重要な場合はこれらのケースを検討し、通常のきれいな出力を署名の正規形式として使用することを避けてください。毎日の構成と API 検査では、チームが使用するインデントを選択し、必要な場合を除いて並べ替えをオフのままにして、ローカルで書式設定し、出力されたテキストを検証します。