JSON
13 tools
JSONとは?
JSON(JavaScript Object Notation)は、人間が読み書きしやすく、機械が解析・生成しやすい軽量なテキストベースのデータ交換フォーマットです。JavaScriptに由来しますが、言語に依存せず、現在ではWeb上のデータ交換のデファクトスタンダードとなっています。
JSONはデータをオブジェクトや配列に組織化されたキーと値のペアとして表現します。このシンプルさにより、REST API、設定ファイル、データストレージの主要フォーマットとなっています。
略史
JSONは2000年代初頭にDouglas Crockfordによって正式化されました。仕様は2001年にjson.orgで公開され、RFC 4627が2006年に、現行のECMA-404標準が2013年に公開されました。
JSON以前はXMLがWebのデータ交換の主流フォーマットでした。JSONのミニマリズム——属性なし、処理命令なし、名前空間なし——により即座に人気を博し、2010年までにWebAPIでXMLを大幅に置き換えました。
JSONのデータ型
JSONはちょうど6つのデータ型をサポートします。有効なJSONドキュメントのすべての値はこれらのいずれかでなければなりません:
"hello world"二重引用符で囲まれた任意のUnicode文字列。バックスラッシュエスケープシーケンス(\n、\t、\")がサポートされています。
42 / 3.14 / 1e10整数または浮動小数点数。科学的記数法(1e10)が許可されています。JSONレベルではintとfloatの区別はありません。
true / falseリテラルトークンtrueまたはfalse(小文字のみ)。truthy/falsyの概念はなく、厳格なブール型のみです。
nullリテラルトークンnull(小文字)。値の不在を表します。JSONの型ではないundefinedとは異なります。
[1, "two", null]角括弧内の順序付き値のリスト。要素は混合型を持つことができ、配列は任意にネストできます。
{"key": "value"}波括弧内のキーと値のペアの順序なしコレクション。キーは文字列でなければなりません。
{
"string": "hello world",
"number": 42,
"float": 3.14,
"boolean": true,
"null": null,
"array": [1, 2, 3],
"object": { "nested": "value" }
}JSON構文ルール
JSONには厳格な構文ルールがあります。少しの逸脱がパースエラーを引き起こします:
すべての文字列値とオブジェクトキーは二重引用符を使用しなければなりません。一重引用符は有効なJSONではありません。
JSONは配列の最後の要素またはオブジェクトの最後のプロパティの後の末尾カンマを許可しません。
JSONにはコメント構文がありません。//と/* */は無効です。コメントが必要な設定ファイルにはJSON5またはYAMLを検討してください。
JSONは6つのプリミティブ型のみサポートします。undefined、NaN、Infinity、関数などのJavaScript値は表現できません。
すべてのオブジェクトキーは引用符付き文字列でなければなりません。数値キーや引用符なしの識別子は許可されません。
JSONは大文字小文字を区別します。true、false、nullはすべて小文字でなければなりません。
無効なJSONと有効なJSON
{
'name': 'Alice', // single quotes — invalid
age: 30, // unquoted key — invalid
"scores": [1, 2, 3,], // trailing comma — invalid
"note": undefined // undefined — invalid
}{
"name": "Alice",
"age": 30,
"scores": [1, 2, 3],
"note": null
}モダンWebにおけるJSON
REST API
JSONはREST APIのリクエストとレスポンスの標準ボディフォーマットです。ほぼすべてのプログラミング言語に組み込みJSONパーサーがあります。
設定ファイル
package.json、tsconfig.json、.eslintrcなど多くの開発ツールがJSON設定を使用しています。
NoSQLデータベース
MongoDB、CouchDB、Amazon DynamoDBなどのドキュメントデータベースはJSON形式でデータを保存します。
フロントエンドの状態とデータ
localStorageとsessionStorageは文字列を保存するため、JSON.stringify/JSON.parseがJavaScriptオブジェクトのシリアライズに常に使われます。
JSON対他のフォーマット
JSONが常に最善の選択とは限りません。他の一般的なデータフォーマットとの比較:
よりシンプルな構文、小さいファイルサイズ、解析が容易、より読みやすい
属性、処理命令、XML名前空間のサポートなし
ドキュメントメタデータ、混合コンテンツモデル、またはXMLスキーマが必要な場合
より厳格な構文(曖昧さが少ない)、より良いツールサポート、より移植性が高い
コメントサポートなし、深くネストされたデータには若干冗長
人間が編集する設定ファイル、Docker Compose、GitHub Actions、Kubernetesマニフェスト
より広いエコシステムサポート、より高速な解析、より予測可能な型処理
ネイティブの日付型なし、複雑なネスト構造には不向き
Rust(Cargo.toml)、Python(pyproject.toml)、INIスタイルのアプリ設定
構造化されたネストデータ、フラットな行と列に限定されない
ファイルサイズが大きく、純粋な表形式データではパフォーマンスが劣る
スプレッドシートデータ、データベースエクスポート、ExcelやPandasで開くデータ
JSON Schema
JSON Schemaは、JSONドキュメントの構造を検証するための語彙です。スキーマはJSON値の期待される型、必須フィールド、制約を記述します。
ajv(JavaScript)、jsonschema(Python)、多くのIDEの組み込みバリデーターがJSON Schemaをサポートしています。OpenAPIはAPI要求・応答ボディの記述にJSON Schemaを使用しています。
JSONの一般的な落とし穴
JSON数値はIEEE 754倍精度浮動小数点数として解析されます。2^53より大きい整数は精度を失います。大きなIDは数値ではなく文字列として渡してください。
JSONには日付型がありません。日付は通常、ISO 8601文字列またはUnixタイムスタンプとしてシリアライズされます。
JSON.stringifyは循環オブジェクト参照でTypeErrorをスローします。
JSONはUTF-8、UTF-16、またはUTF-32でエンコードされなければなりません。JSONファイルの先頭のBOMは仕様に準拠していません。
信頼できないJSONを解析する際、__proto__キーを使ったプロトタイプ汚染攻撃に対して脆弱になる可能性があります。
{"key": null}と欠落している"key"は意味的に異なります。nullはフィールドが存在するが値がないことを意味し、欠落はフィールドが指定されなかったことを意味します。
よくある質問
JSONはJavaScript Object Notationの略です。名前にJavaScriptが含まれますが、JSONは完全に言語非依存です。
いいえ。JSONはJavaScriptオブジェクトリテラルに似たテキストフォーマットですが、より厳格なルールがあります。
いいえ。JSON仕様にはコメント構文が含まれていません。コメントが必要な設定ファイルにはJSONC、JSON5、またはYAMLを検討してください。
JSONPはブラウザの同一オリジンポリシーを回避する古い手法で、現在は廃止されています。CORSを使用してください。
JavaScript: JSON.stringify(data, null, 2)。Python: json.dumps(data, indent=2)。ターミナル: cat file.json | jq .
NDJSONは1行に1つのJSONオブジェクトを保存します。ストリーム処理が可能で、ログファイルや大規模データエクスポートに人気です。
トークン間の空白文字は意味を持ちません。フォーマットはスタイルの問題であり、意味論的な問題ではありません。
JSON仕様はサイズ制限を設けていません。実際にはパーサーのメモリとネットワーク転送によって制限されます。
直接はできません。バイナリデータはJSONに埋め込む前にBase64エンコードする必要があり、サイズが約33%増加します。
JSON5はJSONのスーパーセットで、引用符なしのキー、一重引用符の文字列、末尾カンマ、コメント、複数行文字列を追加します。