web-dev-qa-db-ja.com

JsonConvert.SerializeObject:null値をシリアル化すると予期しない結果

以下のコード行では、string x値の場合、私のclInitializer.AVOptions = nullは実際には「null」の文字列になります。

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

実際のWordの場合と同様に、「null」であり、null値または{}ではありません。これが予想される動作かどうかはわかりません。 「null」という単語を返さないようにする方法を知っている人はいますか、またはJsonConvertの仕組みについて基本的な誤解を持っていますか。前もって感謝します。

6
concentriq

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は無視され、{}

編集済み

「null」が返される理由は、JSONのRFC( https://tools.ietf.org/html/rfc7159 )が明示的に次のように述べているためです。

JSON値は、オブジェクト、配列、数値、文字列、または
次の3つのリテラル名:

false null tr​​ue

リテラル名は小文字でなければなりません。他のリテラル名はありません
許可されています。

値= false/null/true /オブジェクト/配列/数値/文字列

false =%x66.61.6c.73.65;偽

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

true =%x74.72.75.65;本当

編集:

元々回避策がありましたが、RFCに従うべきだと本当に思ったので削除しました。 RFCは、NULLオブジェクトは「null」で表される必要があることを明確に述べているため、回避策を講じるのは良い考えではありません。

RFCを維持するには、「null」を格納するか、「null」ではなくNULLを返します。 「null」を逆シリアル化すると、NULL値が返されます。

〜乾杯

7
Rogala

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

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

文字列nullを返します。

Null clInitializerを持つオブジェクトAVOptionsを渡した場合、JsonSerializerSettingsを使用すると、プロパティAVOptionsが無視され、ストリング。 clInitializerオブジェクトにプロパティAVOptionsのみ(またはnullプロパティのみ)がある場合、{}を渡したときにclInitializerが返されました。

3
Cedar