JSONでnullを表現する 質問する

JSONでnullを表現する 質問する

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 は失敗します。undefinednull

nullこれは、パーを表現する決定的な方法ですJSON仕様


JSON3{"myCount": 0}

この場合、myCount は 0 です。これは と同じではありませんnullし、 と同じでもありませんfalse。条件文が を評価する場合myCount > 0、これは使用する価値があるかもしれません。さらに、ここで値に基づいて計算を実行する場合、0 は役に立つ可能性があります。ただし、 をテストしようとしている場合null、これは実際にはまったく機能しません。


JSON4{"myString": ""}

この場合、空の文字列が返されます。JSON2 の場合と同様に、定義されていますが、空です。 をテストすることはできますが、またはif (obj.myString == "")をテストすることはできません。nullundefined


JSON5{"myString": "null"}

文字列値を null に設定しているため、おそらく問題が発生するでしょう。obj.myString == "null"ただし、この場合はそうではありません == null


JSON6{"myArray": []}

これは、配列はmyArray存在するが空であることを示します。これは、 のカウントまたは評価を実行しようとしている場合に便利ですmyArray。たとえば、ユーザーが投稿した写真の数を評価したい場合、myArray.length次のように実行して0: defined, but no photos posted を返すことができます。

おすすめ記事