web-dev-qa-db-ja.com

Json.netのnullフィールドを無視する

JSONにシリアル化する必要のあるデータがあります。 JSON.NETを使用しています。私のコード構造はこれに似ています:

public struct structA
{
    public string Field1;
    public structB Field2;
    public structB Field3;
}

public struct structB
{
    public string Subfield1;
    public string Subfield2;
}

問題は、JSON出力にはField1 OR Field2 OR Field3-使用されるフィールドに依存します(つまり、nullではありません)。デフォルトでは、JSONは次のようになります。

{
    "Field1": null,
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
    "Field3": {"Subfield1": null, "Subfield2": null},
}

NullValueHandling.Ignore、しかし、それは私にこのようなJSONを与えます:

{
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
    "Field3": {}
}

そして私が必要なのはこれです:

{
    "Field2": {"Subfield1": "test1", "Subfield2": "test2"},
}

これを達成する簡単な方法はありますか?

66
Thaven

はい、JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignoreを使用する必要があります。

ただし、 構造体は値型 であるため、Field2、Field3nullableをマークして必要な結果を取得する必要があります。

public struct structA
{
    public string Field1;
    public structB? Field2;
    public structB? Field3;
}

または、構造体の代わりにクラスを使用します。

ドキュメント: NullValueHandling Enumeration

73
nemesv

また、JsonProperty属性を関連するプロパティに適用し、そのように処理するnull値を設定することもできます。以下の例のReferenceプロパティを参照してください。

注:JsonSerializerSettingsは属性をオーバーライドします。

public class Person
{
    public int Id { get; set; }

    [JsonProperty( NullValueHandling = NullValueHandling.Ignore )]
    public int? Reference { get; set; }

    public string Name { get; set; }
}

ほら.

71
Jaans