2017-10-31 4 views
2

ヌル値をシリアル化するとき、私のstring xの場合clInitializer.AVOptions = null値実際の文字列「NULL」で終わる:実際の単語「ヌル」のようJsonConvert.SerializeObject:予期しない結果を以下のコードの行で

string x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore}); 

null値ではなく、おそらく{}です。私はこれが予想される動作であるとは確信していません。誰も "ヌル"という言葉を返さないようにする方法を知っていますか、またはJsonConvertの仕組みに関する基本的な誤解がありますか?前もって感謝します。

答えて

0

{}は空のjsonオブジェクトです(nullではありません)。したがって、返すことのできる唯一のものはnullオブジェクトのjson表現である "null"です。

string x = null; 

    if (clInitializer.AVOptions != null) { 
     x = JsonConvert.SerializeObject(clInitializer.AVOptions, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore}); 
    } 

がUPDATE:あなたが返され、「ヌルをdisregaringない考慮すべき理由のためRogalaの答え@参照してください、私はあなたが実際のヌル文字列をしたい場合は、ちょうどそうのような呼び出しの周りにif文を置く必要があると思います"値。

+1

RFCに違反しているので、これは良い答えではありません。私はそれが正しい答えとしてどのようにマークされたのか分かりません。 – Rogala

4

NullValueHandlingは、プロパティのnull値と関連しており、オブジェクト自体ではありません。

public class ExampleClass 
{ 
    public string NullProperty { get; set; } 
} 

そして、あなたはそれをシリアル化:あなたは以下の例がある場合たとえば

は、

var obj = new ExampleClass(); 
var jsons = JsonConvert.SerializeObject(obj, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore }); 

を次にNullPropertyは無視され、あなたは{}を取得します。

編集

JSON(https://tools.ietf.org/html/rfc7159)のRFCが明示的に次のように述べているので "NULL" が返される理由は、

A JSON値は、オブジェクト、配列、数値でなければなりません
の、または文字列、あるいは1次の三つリテラル名:

偽ヌル真

リテラル名は小文字である必要があります。その他のリテラル名は
です。

値=偽/ヌル/真/オブジェクト/配列/数/列

偽=%x66.61.6c.73.65。偽

null =%x6e.75.6c.6c; null

true =%x74.72.75.65;真

編集:

私はもともと周りに仕事を持っていましたが、私は本当にあなたがRFCに従うべきだと思うので、私はそれを削除しました。 RFCは、NULLオブジェクトが "null"で表されなければならないことを明示しているため、回避することはお勧めできません。

RFCにとどまるために、 "null"を格納するか、NULLではなく "NULL"を返します。あなたが "null"をデシリアライズすると、NULL値が返されます。

〜乾杯

2

がnullの値は常にnull文字列を返します。

JsonConvert.SerializeObject(null, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore}); 

nullという文字列を返します。あなたがオブジェクトあなたJsonSerializerSettingsでヌルAVOptionsを持ってclInitializerに合格した場合

それが財産AVOptionsを無視して、文字列でそれを持っていないでしょう。 clInitializerオブジェクトのプロパティがAVOptions(またはnullプロパティのみ)の場合、clInitializerに渡すと{}が返されます。