JSONデータ (.json)
RFC 標準JavaScript Object Notation (JSON) は、データ交換のための軽量で人間が読みやすいテキストフォーマットであり、完全に言語から独立し、Web API で広く使用されています。
JSON を HTML に変換
無料のブラウザ内 JSON から HTML へのコンバーター。お使いのデバイスでファイルを即座に変換します。
JSONをオンラインで圧縮
プライベート - ファイルがデバイスの外に出ることはありません
調査とメタデータ
オペレーティングシステムやファイル解析ツールは、先頭のバイナリ列を検査してJSONファイルを識別します:
バイトレベルのヘッダーシグネチャ (マジックバイト)
オペレーティングシステムやファイル解析ツールは、先頭のバイナリ列を検査してJSONファイルを識別します:
16進数シグネチャ(オフセット0):
7B または 5BASCII表現: { または [
標準化: RFC 8259 / ECMA-404 / ISO/IEC 21778
技術仕様
| コンテナアーキテクチャ | 軽量でテキストベース、言語に依存しないデータ交換フォーマット |
| 圧縮 | Gzip / Brotli / Zstandard によるテキスト圧縮 (通常 80%〜90% の圧縮率を達成) |
| バイトエンディアン | UTF-8 エンコードされた Unicode (BOM / Byte Order Mark の使用は非推奨) |
| 色空間 | 該当なし |
| チャンネルと構造 | 6 つの基本データ型: オブジェクト、配列、文字列、数値、真偽値 (boolean)、null |
| 最大寸法 | 制限なし。パーサーのメモリと最大文字列長のみに依存 |
| 透過性 | 該当なし |
| ストリーミングとプログレッシブ | NDJSON (Newline Delimited JSON) / JSON Lines により、プログレッシブなストリーム処理が可能 |
技術比較表:JSONと競合製品
| 技術属性 | JSON (現在) | YAML | XML | Protocol Buffers |
|---|---|---|---|---|
| 構文の複雑さ | 最小限 (6 つの型、厳格な構文) | 高 (インデントベース、複雑な仕様) | 高 (冗長な閉じタグ、名前空間) | スキーマ定義されたバイナリワイヤーフォーマット |
| パース性能 | すべてのモダン言語において極めて高速 | 低速 (複雑なインデントのパース) | 中程度〜低速 (重い DOM 構築) | 超高速 (ゼロコピーバイナリデシリアライゼーション) |
| コメントのサポート | なし (メタデータの肥大化を防ぐために意図的に除外) | あり (# コメント) | あり (<!-- コメント -->) | あり (.proto ファイル内) |
| ネットワークペイロードサイズ | コンパクトなテキスト (非常に高い gzip 圧縮率) | コンパクトなテキスト | 冗長なテキスト (タグの繰り返しが多い) | 超コンパクトなバイナリ |
一般的な破損モードと16進数リカバリガイド
SyntaxError: JSONの位置Xに予期しない「,」があります。
根本原因: RFC 8259 JSONでは配列やオブジェクトの末尾にカンマを配置することは禁止されています。
復旧: JSON.parse()に渡す前に、末尾の不要なカンマを削除してください。
SyntaxError: JSON内に予期しない「'」があります。
根本原因: 文字列やキーが二重引用符("")ではなく単一引用符('')で囲まれています。
復旧: 単一引用符で囲まれたすべての文字列とキーを標準の二重引用符に置換してください。
セキュリティ分析とパーサー攻撃ベクトル
JSON はテキストのみであり、直接的なコード実行からは安全ですが、信頼できない JSON をパースするとプロトタイプ汚染 (Prototype Pollution)、ReDoS、またはメモリ枯渇を引き起こす可能性があります。
既知の攻撃ベクター
- プロトタイプ汚染: '__proto__' または 'constructor' という名前のキーが JavaScript アプリケーション内の Object.prototype を変更する。
- 深くネストされた JSON 構造 (例: 10,000 個の開き括弧) によるスタックオーバーフローを用いたサービス拒否 (DoS)。
- 数値精度の損失: 2^53 - 1 (9,007,199,254,740,991) を超える JavaScript の数値は、静かに精度が失われる。
防御的ベストプラクティス: eval() を使用して JSON を絶対に評価しないこと。JSON.parse() を使用し、再帰的なオブジェクトマージ関数で '__proto__' プロパティをサニタイズすること。
歴史的背景とマイルストーン
主なメリット
- 人間が読めて、自己記述的であり、簡潔なテキスト構造。
- JavaScript エンジン (JSON.parse) およびすべての主要なプログラミング言語に組み込まれたネイティブなパースサポート。
- 厳格な仕様により、任意のコード実行を防ぐ。
技術的な制限とデメリット
- コメント、末尾のカンマ、循環参照オブジェクトのサポートなし。
- ネイティブなバイナリ型なし (バイナリデータは Base64 エンコードが必要であり、サイズが 33% 増加する)。
- Protocol Buffers や MessagePack などのバイナリフォーマットと比較して非効率なシリアライゼーション。
興味深い技術トリビア
- ダグラス・クロックフォードは、元の JSMin JSON ツールに「このソフトウェアは善のために使用し、悪のために使用してはならない (The Software shall be used for Good, not Evil)」というソフトウェアライセンス条項を追加した。
- JSON は JavaScript 構文の厳密なサブセットであるが、ES2019 まで、エスケープされていない生の U+2028 および U+2029 文字は JSON では有効であったが JavaScript の文字列としては無効であった。
- ECMAScript 5 で専用の JSON.parse() API が標準化される前、古い Web ブラウザは JavaScript のネイティブな eval() を使用して JSON を直接オブジェクトに評価できることをダグラス・クロックフォードが発見した。
よくある技術的な質問
なぜ JSON ではコメントが許可されていないのですか?
JSONの文法ではコメントを許可していません。拡張機能やアプリ固有のデータの扱いは実装によって異なるため、形式だけで相互運用性が保証されるわけではありません。
精度を落とさずに 64 ビット整数を JSON に保存するにはどうすればよいですか?
JavaScript のネイティブな Number 型は IEEE 754 倍精度浮動小数点数であり、正確に扱える整数は 2^53 - 1 までです。データベース ID やタイムスタンプなどの 64 ビット整数は、JSON 内では文字列としてシリアライズする必要があります (例: '1234567890123456789')。
JSON と NDJSON / JSON Lines の違いは何ですか?
標準の JSON は、ペイロード全体を単一のルートオブジェクトまたは配列で囲むため、パーサーは評価する前にテキスト全体を読み込む必要があります。一方、NDJSON (Newline Delimited JSON) は、個々の有効な JSON レコードを改行文字 (\n) で区切るため、数ギガバイトにも及ぶ巨大なデータセットをメモリ効率よく行単位でストリーミング処理できます。
関連するJSON変換ペア
JSONデータをHTMLソースに変換することで、生の構造化されたキーと値のペアを、ブラウザでのレンダリングに対応した人間が読みやすいウェブドキュメントに変換できます。
HTMLソースをJSONデータに変換することで、人間が読みやすいウェブドキュメントを、プログラムによる処理やAPIへの取り込み用の構造化されたキーと値のペアに変換します。
SQLダンプテキストスクリプトをJSONデータエクスポートに変換することで、厳格なリレーショナルデータベースのテーブルを、モダンなWebアプリ向けの柔軟なネストされたオブジェクトに変換します。
構造化されていないJSONテキストファイルを構造化されたSQLiteリレーショナルデータベースに変換することで、大量のデータレコードの高速なインデックス作成とクエリ実行が可能になります。
Adobe Swatch Exchange ファイルをカラー JSON 構造に変換し、バイナリデザインパレットを最新のウェブアプリケーション向けの読み取り可能なテキストオブジェクトに変換します。
カラー JSON テキストデータを Adobe ASE バイナリスウォッチに変換することで、ウェブベースのデザイントークンとプロ向けデスクトップレイアウトアプリケーションをつなぎます。
GIMPパレットのテキストファイルをカラーJSON構造に変換することで、複雑な解析スクリプトを使用せずに、Webアプリケーションから直接カラー見本を読み込むことができるようになります。
構造化されたカラーJSONファイルをCSS変数に変換することで、生のデータオブジェクトをWebサイト向けのネイティブなスタイリングプロパティに変換します。