1. ホーム
  2. json

[解決済み] JSONでnullを表現する

2022-03-19 13:29:25

質問

JSONでNULL値を返すには、どのような方法が望ましいですか?プリミティブの場合、別の優先順位があるのでしょうか?

例えば、サーバー上の私のオブジェクトに "myCount" という名前のIntegerがあり、値がない場合、その値に対する最も正しいJSONは次のようになります。

{}

または

{
    "myCount": null
}

または

{
    "myCount": 0
}

文字列に関する同じ質問 - サーバー上にヌル文字列 "myString" がある場合、最適なJSONは何ですか。

{}

または

{
    "myString": null
}

または

{
    "myString": ""
}

または(主よ、お助けください)

{
    "myString": "null"
}

コレクションは、JSONでは空のコレクションとして表現される慣例が好きです http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

空のArrayを表現することになる。

{
    "myArray": []
}

EDITの概要

個人的な好み」という主張は現実的であるように思えますが、コミュニティとしてこれまで以上に多くの異種のサービスやソースを消費することになるという点では、近視眼的なものであると言えます。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>

解決方法は?

それぞれの構文解析を評価してみましょう。

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: []}


<ブロッククオート

tl;dr をここで紹介します。

のフラグメントは json2 変数は、方法 JSON仕様 null を表現する必要があります。しかし、いつものように、それはあなたが何をしているかによります -- 時々、"正しい"やり方があなたの状況に対して常に機能するとは限りません。自分の判断で、十分な情報を得た上で決定してください。


JSON1 {}

これは空のオブジェクトを返します。そこには何のデータもなく、探しているキーが何であれ(それが myCount または他の何か)の型は undefined .


JSON2 {"myCount": null}

この場合 myCount は実際に定義されていますが、その値は null . これは ではない と同じです。 undefinednull というように、どちらかの条件を満たすかどうかをテストする場合、JSON1が失敗するのに対して、これは成功するかもしれません。

を表現する決定的な方法です。 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 : 定義されているが、写真が投稿されていない。