JSON で null 値を返すための推奨される方法は何ですか? プリミティブには別の推奨方法がありますか?
たとえば、サーバー上のオブジェクトに値のない「myCount」という整数がある場合、その値に対する最も正しい JSON は次のようになります。
{}
または
{
"myCount": null
}
または
{
"myCount": 0
}
文字列についても同じ質問です。サーバー上に null 文字列「myString」がある場合、最適な JSON は次のようになります。
{}
または
{
"myString": null
}
または
{
"myString": ""
}
または(主よ、助けてください)
{
"myString": "null"
}
私はコレクションをJSONで空のコレクションとして表現するという慣例が好きですhttp://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
空の配列は次のように表されます。
{
"myArray": []
}
編集概要
「個人の好み」という議論は現実的に思えますが、コミュニティとして私たちはますます多くの異なるサービス/ソースを消費することになるという点で、近視眼的です。JSON 構造の規約は、これらのサービスの消費と再利用を標準化するのに役立ちます。標準を確立する限り、いくつかの例外を除いて、Jackson 規約のほとんどを採用することをお勧めします。
- プリミティブよりもオブジェクトが優先されます。
- 空のコレクションは null よりも優先されます。
- 値のないオブジェクトは null として表されます。
- プリミティブは値を返します。
ほとんどが null 値である JSON オブジェクトを返す場合は、複数のサービスにリファクタリングする候補がある可能性があります。
{
"value1": null,
"value2": null,
"text1": null,
"text2": "hello",
"intValue": 0, //use primitive only if you are absolutely sure the answer is 0
"myList": [],
"myEmptyList": null, //NOT BEST PRACTICE - return [] instead
"boolean1": null, //use primitive only if you are absolutely sure the answer is true/false
"littleboolean": false
}
上記の JSON は次の Java クラスから生成されました。
package jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonApp {
public static class Data {
public Integer value1;
public Integer value2;
public String text1;
public String text2 = "hello";
public int intValue;
public List<Object> myList = new ArrayList<Object>();
public List<Object> myEmptyList;
public Boolean boolean1;
public boolean littleboolean;
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Data()));
}
}
Maven 依存関係:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
ベストアンサー1
それぞれの解析を評価してみましょう。
http://jsfiddle.net/brandonscript/Y2dGv/
var json1 = '{}';
var json2 = '{"myCount": null}';
var json3 = '{"myCount": 0}';
var json4 = '{"myString": ""}';
var json5 = '{"myString": "null"}';
var json6 = '{"myArray": []}';
console.log(JSON.parse(json1)); // {}
console.log(JSON.parse(json2)); // {myCount: null}
console.log(JSON.parse(json3)); // {myCount: 0}
console.log(JSON.parse(json4)); // {myString: ""}
console.log(JSON.parse(json5)); // {myString: "null"}
console.log(JSON.parse(json6)); // {myArray: []}
要約すると:
json2変数のフラグメントはJSON仕様表現する必要があることを示します
null
。ただし、常にそうであるように、それはあなたが何をしているかに依存します。場合によっては、「正しい」方法であっても、必ずしも状況に適しているとは限りません。自分の判断力を使って、十分な情報に基づいて決定してください。
JSON1{}
myCount
これは空のオブジェクトを返します。そこにはデータは存在せず、探しているキー (それが何であれ、他の何か) が 型であるということだけがわかりますundefined
。
JSON2{"myCount": null}
この場合、myCount
は実際には定義されていますが、その値は ですnull
。これは、 「 かつではない」と同じではありません。どちらか一方の条件をテストする場合、これは成功するかもしれませんが、JSON1 は失敗します。undefined
null
null
これは、パーを表現する決定的な方法ですJSON仕様。
JSON3{"myCount": 0}
この場合、myCount は 0 です。これは と同じではありませんnull
し、 と同じでもありませんfalse
。条件文が を評価する場合myCount > 0
、これは使用する価値があるかもしれません。さらに、ここで値に基づいて計算を実行する場合、0 は役に立つ可能性があります。ただし、 をテストしようとしている場合null
、これは実際にはまったく機能しません。
JSON4{"myString": ""}
この場合、空の文字列が返されます。JSON2 の場合と同様に、定義されていますが、空です。 をテストすることはできますが、またはif (obj.myString == "")
をテストすることはできません。null
undefined
JSON5{"myString": "null"}
文字列値を null に設定しているため、おそらく問題が発生するでしょう。obj.myString == "null"
ただし、この場合はそうではありません == null
。
JSON6{"myArray": []}
これは、配列はmyArray
存在するが空であることを示します。これは、 のカウントまたは評価を実行しようとしている場合に便利ですmyArray
。たとえば、ユーザーが投稿した写真の数を評価したい場合、myArray.length
次のように実行して0
: defined, but no photos posted を返すことができます。