ToolHub
View All Posts

JSONフォーマットベストプラクティス

JSON(JavaScriptオブジェクト表示法)已になるWeb上データ交換の事实標準。API戻るJSON,設定ファイル使用JSON,甚至データベースも保存するJSONドキュメント。にもかかわらずJSONとても簡単,しかしそれあり严格の構文规すなわち,とても簡単違反する,フォーマット不時にのJSONできるをもたらすデバッグ困難、パフォーマンス问题と安全脆弱性。このガイドではたについて正しくフォーマットするJSONあなた理解する必要がありますの一切,から基本構文までSchema検証すると処理する大型ファイルなど高级テーマ。

とはJSON?

JSONは一種の軽量级の、に基づく文本のデータ交換フォーマット,源自JavaScriptオブジェクト字面量構文。それ由Douglas Crockfordで2000年代初指定,かつ標準化のためにECMA-404とRFC 8259。JSONの設計する目标は簡単性、人間の可読性と跨プログラミング言語の易実装する性。如今,毎種類主にプログラミング言語すべてを含む内置のJSON支持する。

JSON支持する六種類データタイプ:文字列(双引号)、数値(全体数と浮点数)、ブール値(trueとfalse)、null值、オブジェクト(なし序键值集合)と配列(番号付きリスト)。それ原生コメント非対応、日付、二入制データまたはundefined值。

JSON構文规すなわち

JSONあり必須严格従うの構文。たとえ〜でも一つの字符間違いもできるをもたらす全体のドキュメント解析する失敗。理解するこれらの规すなわちできる防止する最も一般的のフォーマットする間違い。

文字列はダブルクォートを使用

すべての文字列值とオブジェクト键必須用双引号括起来。単引号いいえ有効のJSON文字列分隔符。これはからJavaScript转来の開発者最も一般的の間違いの一つ,JavaScript内単引号と双引号できる互换使用。

// Invalid - single quotes
{'name': 'Alice', 'age': 30}

// Valid - double quotes
{"name": "Alice", "age": 30}

オブジェクトキーはクォート必須

とJavaScriptオブジェクト字面量異なる,JSON要件すべてのオブジェクト键すべて用双引号括起来。未加引号の键は構文間違い。

// Invalid - unquoted keys
{name: "Alice", age: 30}

// Valid - quoted keys
{"name": "Alice", "age": 30}

末尾のカンマ禁止

JSON不許可するでオブジェクトまたは配列の最後に一项後加逗号。これはJavaScript開発者の另一つの常见間違い,JavaScript内尾随逗号は許可するの(で某些风格ガイド中甚至られる鼓励)。

// Invalid - trailing comma
{
  "name": "Alice",
  "age": 30,
}

// Valid - no trailing comma
{
  "name": "Alice",
  "age": 30
}

コメント非対応

JSONコメント非対応。//単行コメントと/* */多行コメントでJSON中すべて無効。もしあなた必要とするを含むドキュメント,考慮する使用単独のドキュメントファイルまたは某些ツール支持するのJSONC(带コメントのJSON)フォーマット。

厳密な値の型

JSON值必須は六種類支持するタイプの一つ。undefined、NaN、Infinityと-Infinityいいえ有効のJSON值。を含む其中任意の一つのすべてできるをもたらす解析する間違いまたは生み出す多くの解析する器できる拒否するの非標準JSON。

よくあるフォーマットエラー

を除いて構文間違い,さらにいくつ種類フォーマットする間違いできる生み出す技术上有効しかしあり问题のJSON:

プリティプリントと圧縮する

JSONの两種類主にフォーマットするパターン服务于異なる目的,で正しくのコンテキスト中使用正しくのフォーマットとても重する必要がある。

プリティプリントされたJSON

プリティプリント追加するインデントと改行符させるJSON正人类可読。これで開発する、デバッグとドキュメント编写期间非常に重要です。大多数のJSONフォーマット器默认使用2スペースインデント:

{
  "users": [
    {
      "id": 1,
      "name": "Alice",
      "email": "alice@example.com"
    },
    {
      "id": 2,
      "name": "Bob",
      "email": "bob@example.com"
    }
  ]
}

圧縮されたJSON

圧縮する削除するすべての不必する必要があるの空白,生み出す尽かもしれない小の有効JSON。これに対して各字节すべてとても重する必要があるの生产API非常に重要です:

{"users":[{"id":1,"name":"Alice","email":"alice@example.com"},{"id":2,"name":"Bob","email":"bob@example.com"}]}

どちらを使用すべきか

コンテキストフォーマット理由
開発とデバッグプリティプリント可読性と素早いスキャン
設定ファイルプリティプリント人間が読み書きする必要があるファイル
本番APIレスポンス圧縮するより小さいペイロード、より高速な転送
ログファイル圧縮する(毎行一つのオブジェクト)コンパクトな保存、grep検索に便利
バージョン管理プリティプリント意味のある差分とマージコンフリクトの減少
ベストプラクティス:常にでバージョン管理中もってフォーマットする形式保存する JSON。する圧縮するとしてデプロイする前の構築する步骤。これ样あなたできる獲得する可読の差异比較する,同時にで生产環境中獲得する圧縮する JSON のパフォーマンス优势。

JSON Schema検証する

だがJSON構文検証する確認するドキュメントはいいえフォーマット良良,しかしそれ不検証するデータはいいえを持つ预期の结构、タイプまたは值。JSON Schemaを通じて提供する説明するJSONデータ预期形状の词汇来填补これ一空白。

とはJSON Schema?

JSON Schemaは一つの説明する其彼JSONドキュメント结构のJSONドキュメント。それさせるあなたできる指定必須フィールド、预期タイプ、值範囲、文字列パターンと嵌套オブジェクト结构。適合するSchemaのJSONドキュメントと呼ばれる有効インスタンス。

常见Schema機能

何时使用Schema検証する

するたびにあなたから外部ソース受信するJSON时すべて应使用JSON Schema検証する:APIリクエストする体、設定ファイル、データインポートとメッセージキュー負荷。Schema検証する可ならびに早捕获間違い,明確なエラーメッセージを提供,かつとしてデータフォーマットの活ドキュメント。のようなAjv(JavaScript)、jsonschema(Python)とjson-schema-validator(Java)などライブラリするためするSchema検証する統合するまで任意の適用する中变て簡単。

JSONサイズのパフォーマンスへの影響

JSONドキュメントの大小直接影対応用パフォーマンス,体今多个側面:ネットワーク転送時間、解析する時間とメモリ消耗。理解するこれらの影響するに役立つあなた正JSONフォーマットと结构做出明智の决策。

ネットワーク転送

JSONの各字节すべて必須を通じてネットワークからサーバー転送するまでクライアント。で高速接続する上,10KBと100KBの間の差异かもしれない看似微不十分な道,しかしで移动ネットワークまたは互联网やや遅い地域の用户看来,影響するは显著の。研究表明,毎増やす100msの読み込む時間できる下げる约1%の转化率。圧縮する通常するJSON大小減らす30-50%,gzip圧縮する额外減らす70-85%。常にのためにJSON API対応有効化gzipまたはBrotli圧縮する。

パースパフォーマンス

JSON解析するの代价惊人に高。に対して大型ドキュメント(超たことがある1MB),で移动设备上解析するかもしれない必要とする数百ミリ秒。成本大致とドキュメント大小成线性リレーション。減らす解析する成本の閉键ストラテジーを含む:仅送信するクライアント必要とするのデータ(字段フィルター)、正大型結果集入行ページネーション,ならびにで必要ない人間の可読性の内部服务间通信中使用より効率的のシリアル化するフォーマット如Protocol BuffersまたはMessagePack。

メモリ使用

解析する後のJSON通常消耗比其シリアル化する形式多3-10倍のメモリ,なぜなら各值になるを持つ自己メモリ分配の独立オブジェクト。1MBのJSON文字列解析する後かもしれない使用5-10MBのRAM。に対してでメモリあり限のブラウザ中実行するのJavaScript適用する,これかもしれないをもたらす低端设备上のパフォーマンス下降または崩溃。

JSON と JSONL

JSON Lines(JSONLまたはNDJSON)は一種の相閉フォーマット,解决たJSONの一つの閉键制限する:要件する全体のドキュメントとして単个単元解析する。でJSONL中,ファイルの毎一行すべては一つの完全の、独立のJSONオブジェクト。

何时使用JSONL

何时坚持使用標準JSON

大きなJSONファイルの処理

大型JSONファイル(超たことがある10MB)提出た必要とする特殊処理するの独特挑战。標準解析する方法でこれ種類规模下かもしれない失敗またはパフォーマンス不佳。

ストリーミングパーサー

ストリーム式(またはSAX风格)解析する器增量処理するJSON,なし需する全体のドキュメント読み込むまでメモリ中。それ们で遇まで结构元素(如オブジェクト開始する、キーと値のペアと配列项)时发出イベント。これ種類方法にかかわらずファイル大小どのようにすべて使用恒定メモリ。のようなoboe.js(JavaScript)、ijson(Python)とJackson Streaming API(Java)などライブラリ提供するストリーム式JSON解析する。

大きなファイルの実用的なヒント

JSONセキュリティの注意事項

だがJSONは一種のデータフォーマットかつ本身かつ非安全でない,しかし適用する処理するJSONの方式かもしれない引入脆弱性。理解するこれらのリスクに対して構築する安全系统非常に重要です。

eval() でJSONをパースしない

最も閉键の安全规すなわち:絶対にしないでください使用JavaScriptのeval()函数来解析するJSON。eval()実行する任意JavaScriptコード,これは以下を意味します悪意のあるJSON負荷できるで用户机器上実行するコード。常に使用JSON.parse(),それだけ解析する有効のJSONかつ拒否する任意の可実行するコード。これはできない商量の。

JSONPとクロスドメインリスク

JSONP(带填充のJSON)はでCORSられる広くサポート前に绕たことがある同源ストラテジー制限するの一種の技术。それを通じてするJSONデータ包装でとして脚本実行するの函数调用中来工作。これ本質的には危険の,なぜならそれ実行する来自第三方サーバーの任意JavaScript。もしあなた同時に制御するクライアントとサーバー,请使用CORSそして非JSONP。JSONP应られると見なす遗留技术,で新規適用する中应避ける使用。

プロトタイプ汚染

JavaScript内マージまたは深拷贝JSONオブジェクト时,する必要がある警惕__proto__、constructorとprototypeなど键。もし用户提供するのJSONで未清理これらの键の情况下られる递归マージまで现ありオブジェクト中,それできる変更する適用する中すべてのオブジェクトのプロトタイプ,をもたらす权限向上させるまたは拒否する服务。マージ前常に清理オブジェクト键。

深いネストによるDoS

精心构造のを持つ极端嵌套奥行き(数千层)のJSONドキュメントかもしれないをもたらす递归解析する器中のヒープスタック溢出間違い。を通じてで解析する器中設定する最大嵌套奥行き来緩和此问题。大多数の生产JSON解析する器許可するあなた設定する此制限する。

入力検証

絶対にしないでください信頼来自外部ソースのJSONデータ。で使用前に常に検証する传入JSONの结构、タイプと值範囲。JSON Schema検証するは最も稳健の方法,しかしたとえ〜でもは正必須フィールドと型アサーションの簡単確認するもできる正フォーマット間違いまたは悪意のある入力する提供する显著保護する。

必要とするフォーマットする、検証するまたは圧縮するJSON?無料のオンラインJSONツール。すべての処理はブラウザ内で行われます,最大限の速度とプライバシーを確保。

JSONフォーマッターJSONバリデーター

よくある質問

プリティプリントと圧縮されたJSON違いは何か?

プリティプリントされたJSONを含む空白(インデント、改行)供人类読む,そして圧縮されたJSON削除するすべての不必する必要があるの空白もって最小化ファイル大小。で開発とデバッグ期间使用プリティプリントされたJSON,で生产環境中使用圧縮されたJSONもって獲得するより小のネットワーク負荷とより速の解析する。

最も一般的のJSONフォーマット間違いありどの?

最も一般的の間違いは:オブジェクトまたは配列最後に一项後の尾随逗号、文字列使用単引号そして非双引号、追加するコメント(JSONコメント非対応)、使用未加引号のオブジェクト键,ならびにを含むundefinedまたはNaNなど非有効JSON值。

何时使用すべきJSONLそしていいえJSON?

時にあなた必要とする增量処理する記録する时使用JSONL(JSON Lines),例えばログファイル、データストリームまたはなし法装入メモリの大型データセット。毎行は一つの完全のJSONオブジェクト,したがってあなたできる一次読み取ると解析する一行そしてなし需読み込む全体のファイル。標準JSON要件でアクセスする任意のデータ前に解析する完全ドキュメント。

どのようにに基づいてSchema検証するJSON?

使用JSON Schema定義するJSONデータの预期结构,それから使用Ajv(JavaScript)、jsonschema(Python)などライブラリまたはオンライン検証する器に基づいて该Schema検証するインスタンス。JSON Schemaさせるあなたできる指定必須フィールド、タイプ、值範囲、文字列パターンと嵌套オブジェクト结构。

JSONに使用されるデータ交換安全か?

JSON本身は一種のデータフォーマット,既非安全も非安全でない。しかし,あなた解析すると使用JSONの方式かもしれない引入脆弱性。主にリスクは使用eval()解析するJSON(絶対にしないでくださいこれ样做——常に使用JSON.parse())。さらにする必要がある警惕JSONP,それかもしれない绕たことがある同源ストラテジー。常にで使用前検証すると清理来自不受信頼ソースのJSONデータ。