JSONのnull(undefinedは存在しない)

JSONがnull値をどのように処理するか、そしてundefinedがJSONに存在しない理由を理解しましょう。JSONドキュメントで欠損データや不在データを正しく表現する方法を解説します。

Concept

詳細な説明

JSONにおいて、null は値の意図的な不在を表すファーストクラスのデータ型です。JavaScriptのコア概念である undefined は、JSON仕様には全く存在しません。この違いはJavaScript開発者にとって混乱の原因となりがちです。

JSONにおけるnullの意味:

リテラル null(常に小文字)は、キーは存在するが意味のある値を持たないことを示します。空文字列("")、数値ゼロ(0)、boolean false、空のobject({})とは異なります。例えば、{"middleName": null} は、middleName フィールドがスキーマに存在するが、ユーザーが提供していないことを伝えます。これはキーを完全に省略することとは異なり、省略はフィールドがスキーマの一部でない可能性を暗示します。

undefinedが除外されている理由:

JSONは言語に依存しないデータ交換形式として設計されています。undefined の概念はJavaScriptといくつかの他の言語に固有のものです。ほとんどのプログラミング言語では、同等の概念がありません。変数は値を持つか、存在しないかのいずれかです。JSONに undefined を含めると、それをサポートしない言語で曖昧さが生じます。Douglas Crockfordは、すべての主要なプログラミング言語にクリーンにマッピングできる型にJSONを意図的に限定しました。

JavaScriptでのundefinedの扱い:

JavaScriptオブジェクトに対して JSON.stringify() を呼び出すと、undefined 値を持つプロパティは出力から暗黙に省略されます:

JSON.stringify({ a: 1, b: undefined, c: 3 })
// Output: '{"a":1,"c":3}'

arrayでは、undefined 値は null に置換されます:

JSON.stringify([1, undefined, 3])
// Output: '[1,null,3]'

この非対称的な動作は、JSONのシリアライズとデシリアライズを通じてデータをラウンドトリップする際のバグの一般的な原因です。

開発者がよくやるミス:

開発者はJSONファイルやテンプレートで {"key": undefined} と記述し、動作することを期待することがよくあります。undefined は有効なJSONトークンではないため、パースエラーが発生します。もうひとつのミスは、キーの有無に意味を持たせる際に慣例をドキュメント化しないことです。{"status": null}"status" の完全な不在の両方があり得る場合、APIドキュメントでその意味的な違いを明確にする必要があります。

ベストプラクティス:

フィールドが存在するが値がないことを示したい場合は、明示的に null を使用してください。フィールドが該当しないかレスポンスの一部でない場合は、キーを省略してください。両方のケースの解釈方法をドキュメント化してください。TypeScriptでは、nullable値は fieldName: string | null、オプション値は fieldName?: string として表現しましょう。

ユースケース

ユーザープロフィールAPIレスポンスを設計し、middleNameのようなオプションフィールドが未提供の場合にnullを設定して、欠損データと不在フィールドを明確に区別する。

試してみる — JSON Formatter

フルツールを開く