JSONにnull値を含める必要があります[終了]


89

結果をJSONとして返すAPIを作成しています。値がnullの場合に結果にキーを含める必要があるかどうかの現在のベストプラクティスはありますか?例えば:

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}

または

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}

2番目の方が小さいので、このスタイルに傾いていますが、優先されるスタイルがあるかどうかはわかりません。クライアントの観点からは、両方のスタイルが機能的に同等であるように思われます。それぞれの長所と短所はありますか?


6
これに正しく答えることは不可能です。正しい答えは、アプリケーションの要件によって異なります。OPは単に自分の要件に合った答えを選択しました。「isbn」がnullであるかどうかを確認する必要があるアプリケーションと、「isbn」が別の理由でサーバーから送信されていない可能性があるかどうかをアプリケーションで区別できるようにする必要がある場合は、それを含める必要があります。
ジェイコブ

@Jacob言いませんでしたが、この質問に対する私の意図は、応答を表す「完全な」JSONが返されていることでした。クライアントが2つのアプローチに機能的な違いはないと思われる場合。APIが選択的にキー/値を返さない場合は、どのアプローチを採用したかによって大きな違いが生じます。
jjathman 2015

最初の表現の利点は、オブジェクトスキーマが保持され、データに基づいてプロパティの存在があいまいにならないことです。2番目の形式では、この情報は失われます。JSON仕様自体はどちらの形式のAFAIKも義務付けていません
Surya Pratap

回答:


32

2番目の方法では、帯域幅を少し節約できますが、それが問題になる場合は、JSONをキーで埋める代わりに、インデックス付き配列も使用します。明らかに、["Foo Bar","Joe Blow"]現在のものよりはるかに短いです。

使いやすさの点では、違いはないと思います。どちらの場合も、if(json.isbn)にスキップしますelsenull(値なし)とundefined(値なし)を区別する必要は通常ありません。


7
+1 for 通常、null(値なし)とundefined(値なし)を区別する必要はありません。そのための便利なオペレーターさえあります!= null(厳密な意図ではあり
ません

私が考えられる唯一のケースは、ブラウザが特定のイベントタイプをサポートしているかどうかをテストすることです。たとえば、がサポートさif( typeof onbeforepaste == "undefined")れているかどうかを確認onBeforePasteします。それでも、必要なだけイベントを割り当てることができるため、実際の違いはありません(サポートされていない場合は何もしません)。
Niet the Dark Absol

6
転送されたバイトを節約するという点では、インデックス付き配列のようなものよりも圧縮がはるかに重要です。web-resource-optimization.blogspot.no/2011/06/…それが最初に行うことを確認してください。ほとんどの場合、その上にインデックス付き配列などを追加することは、私が時期尚早な最適化と呼ぶものです。大量のデータを送信する場合を除きます。また、追加の解析が必要であり、アプリがさらに複雑になります。Gzip圧縮はブラウザによってシームレスに行われます。(クライアントがブラウザであると想定)
Martin Hansen

3
HTTPSが当たり前になっているため(少なくともユーザーベースが大きいアプリの場合)、圧縮は簡単に行えます。en.wikipedia.org/wiki/CRIME_%28security_exploit%29を
Gaurav Vaish 14年

6
評判があれば、「nullを区別する必要は通常ありません」の場合、実際には-1になります。2つの理由から:1.存在を区別する理由と珍しいことではありません2.ベストプラクティスは、常に「明確に定義された」値を使用することです。これは、あいまいさを常に防ぐことを意味します。
Srneczek

80

私は常にnullを明示的に含めることのファンです。プロパティを省略すると、あいまいさが残ります。

サーバーとのプロトコルが合意されている限り、上記のいずれでも機能しますが、サーバーからnullを渡すと、後でAPIがより柔軟になると思います。

また、JavaScriptのhasOwnProperty関数を使用すると、さらに洞察を得ることができます。

/* if true object DOES contain the property with *some* value */
if( objectFromJSON.hasOwnProperty( "propertyName" ) )

/* if true object DOES contain the property and it has been set to null */
if( jsonObject.propertyName === null )

/* if true object either DOES NOT contain the property
   OR
   object DOES contain the property and it has been set to undefined */
if( jsonObject.propertyName === undefined )

3
正確には、 ""、null、およびundefinedの違いを理解する必要がある人が増えます。この質問に対する答えは、ユーザーの要件によって異なります。
Jacob

13
+1。反対側の人(コードを書いた人)は、明示的な値を提供するほうが適切です。彼らはJavaScriptを書いていないかもしれません;-)
Steve11235 '21

2
nullのチェックは==では機能せず、===が必要であることに注意してください(未定義の== nullのため)。
トミー

受け入れられた回答の最初の部分は正確に間違っています...
Srneczek

"propertyName" in objectFromJSON代わりに書きますobjectFromJSON.hasOwnProperty("propertyName")。また、使用を主張する場合は、安全のためにhasOwnProperty書いObject.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")てください。
Aadit M Shah

22

JavaScriptでは、とnullは非常に異なるものを意味しますundefined

JSON出力は、JSONデータを使用する特定のコンテキストでアプリケーションが使用および必要とするものを反映する必要があります。


5
-私は彼が「空」の特性やない含めるだけかどうかを尋ねると思いますので、何も「未定義」は、JSONではありません{"prop":undefined}異なっています{}
Bergi

同意しますが、受信側でnullに設定する特定のプロパティを探している場合はnullにならないことを説明しようとしています。省略した場合、未定義になります。
ブラッド

11

区別する必要がある場合、あなたは間違いなくそれを含める必要がありますnullし、undefinedそれらのため、JavaScriptで二つの異なる意味を持ちます。nullプロパティが不明または無意味であること、およびundefinedプロパティが存在しないことを意味すると考えることができます。

一方、誰かがその区別をする必要がない場合は、先に進んでそれを省略します。


0

JSONをユーザーエクスペリエンスの背後にあるデータとして使用しても、違いはないと思います。

ユーザーが何かを手動で編集する必要がある場合、違いはJSON-configファイルに表示されます。最初の例を使用すると、設定に関するヒントをユーザーに提供します。


1
提供するソリューションについてもう少し説明を追加して、回答を詳しく説明していただけませんか?
abarisone 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.