Ignorieren von Nullfeldern in Json.net

71

Ich habe einige Daten, die ich in JSON serialisieren muss. Ich benutze JSON.NET. Meine Codestruktur ähnelt der folgenden:

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

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

Das Problem ist, dass meine JSON-Ausgabe NUR Field1ODER Field2ODER haben muss Field3- es hängt davon ab, welches Feld verwendet wird (dh nicht null). Standardmäßig sieht mein JSON folgendermaßen aus:

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

Ich weiß, dass ich verwenden kann NullValueHandling.Ignore, aber das gibt mir JSON, das so aussieht:

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

Und was ich brauche ist folgendes:

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

Gibt es einen einfachen Weg, dies zu erreichen?

Thaven
quelle

Antworten:

79

Ja, Sie müssen verwenden JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

Aber weil structs Werttypen sind brauchen Sie Field2, Field3 markieren nullable zu erhalten das erwartete Ergebnis:

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

Oder verwenden Sie einfach Klassen anstelle von Strukturen.

Dokumentation: NullValueHandling Enumeration

nemesv
quelle
1
Weitere Informationen finden Sie unter james.newtonking.com/archive/2009/10/23/…
Mickey Perlstein
75

Sie können das JsonProperty-Attribut auch auf die relevanten Eigenschaften anwenden und die Behandlung mit Nullwerten auf diese Weise festlegen. Beziehen Sie sich auf die ReferenceEigenschaft im folgenden Beispiel:

Hinweis: Das JsonSerializerSettingsüberschreibt die Attribute.

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

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

    public string Name { get; set; }
}

Hth.

Jaans
quelle