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ドキュメントのすべての値はこれらのいずれかでなければなりません:

String"hello world"

二重引用符で囲まれた任意のUnicode文字列。バックスラッシュエスケープシーケンス(\n、\t、\")がサポートされています。

Number42 / 3.14 / 1e10

整数または浮動小数点数。科学的記数法(1e10)が許可されています。JSONレベルではintとfloatの区別はありません。

Booleantrue / false

リテラルトークンtrueまたはfalse(小文字のみ)。truthy/falsyの概念はなく、厳格なブール型のみです。

Nullnull

リテラルトークンnull(小文字)。値の不在を表します。JSONの型ではないundefinedとは異なります。

Array[1, "two", null]

角括弧内の順序付き値のリスト。要素は混合型を持つことができ、配列は任意にネストできます。

Object{"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を検討してください。

undefinedや関数は不可

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が常に最善の選択とは限りません。他の一般的なデータフォーマットとの比較:

JSON vs XML
XMLに対するJSONの利点

よりシンプルな構文、小さいファイルサイズ、解析が容易、より読みやすい

XMLに対するJSONの欠点

属性、処理命令、XML名前空間のサポートなし

XMLを選ぶ場合

ドキュメントメタデータ、混合コンテンツモデル、またはXMLスキーマが必要な場合

JSON vs YAML
YAMLに対するJSONの利点

より厳格な構文(曖昧さが少ない)、より良いツールサポート、より移植性が高い

YAMLに対するJSONの欠点

コメントサポートなし、深くネストされたデータには若干冗長

YAMLを選ぶ場合

人間が編集する設定ファイル、Docker Compose、GitHub Actions、Kubernetesマニフェスト

JSON vs TOML
TOMLに対するJSONの利点

より広いエコシステムサポート、より高速な解析、より予測可能な型処理

TOMLに対するJSONの欠点

ネイティブの日付型なし、複雑なネスト構造には不向き

TOMLを選ぶ場合

Rust(Cargo.toml)、Python(pyproject.toml)、INIスタイルのアプリ設定

JSON vs CSV
CSVに対するJSONの利点

構造化されたネストデータ、フラットな行と列に限定されない

CSVに対するJSONの欠点

ファイルサイズが大きく、純粋な表形式データではパフォーマンスが劣る

CSVを選ぶ場合

スプレッドシートデータ、データベースエクスポート、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をスローします。

UnicodeとBOMの問題

JSONはUTF-8、UTF-16、またはUTF-32でエンコードされなければなりません。JSONファイルの先頭のBOMは仕様に準拠していません。

プロトタイプ汚染

信頼できないJSONを解析する際、__proto__キーを使ったプロトタイプ汚染攻撃に対して脆弱になる可能性があります。

nullと存在しないキー

{"key": null}と欠落している"key"は意味的に異なります。nullはフィールドが存在するが値がないことを意味し、欠落はフィールドが指定されなかったことを意味します。

よくある質問

JSONとは何の略語ですか?

JSONはJavaScript Object Notationの略です。名前にJavaScriptが含まれますが、JSONは完全に言語非依存です。

JSONはJavaScriptオブジェクトと同じですか?

いいえ。JSONはJavaScriptオブジェクトリテラルに似たテキストフォーマットですが、より厳格なルールがあります。

JSONにコメントを入れられますか?

いいえ。JSON仕様にはコメント構文が含まれていません。コメントが必要な設定ファイルにはJSONC、JSON5、またはYAMLを検討してください。

JSONとJSONPの違いは何ですか?

JSONPはブラウザの同一オリジンポリシーを回避する古い手法で、現在は廃止されています。CORSを使用してください。

JSONを読みやすくフォーマットするには?

JavaScript: JSON.stringify(data, null, 2)。Python: json.dumps(data, indent=2)。ターミナル: cat file.json | jq .

NDJSONやJSON Linesとは何ですか?

NDJSONは1行に1つのJSONオブジェクトを保存します。ストリーム処理が可能で、ログファイルや大規模データエクスポートに人気です。

JSONで空白文字は重要ですか?

トークン間の空白文字は意味を持ちません。フォーマットはスタイルの問題であり、意味論的な問題ではありません。

JSONファイルの最大サイズはどのくらいですか?

JSON仕様はサイズ制限を設けていません。実際にはパーサーのメモリとネットワーク転送によって制限されます。

JSONはバイナリデータを表現できますか?

直接はできません。バイナリデータはJSONに埋め込む前にBase64エンコードする必要があり、サイズが約33%増加します。

JSON5とは何ですか?

JSON5はJSONのスーパーセットで、引用符なしのキー、一重引用符の文字列、末尾カンマ、コメント、複数行文字列を追加します。