web-dev-qa-db-fra.com

Ignorer les champs nuls dans Json.net

J'ai des données que je dois sérialiser en JSON. J'utilise JSON.NET. Ma structure de code est similaire à ceci:

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

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

Le problème est que ma sortie JSON doit avoir SEULEMENT Field1 OR Field2 OR Field3 - cela dépend du champ utilisé (c'est-à-dire non nul). Par défaut, mon JSON ressemble à ceci:

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

Je sais que je peux utiliser NullValueHandling.Ignore, mais cela me donne un JSON qui ressemble à ceci:

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

Et ce dont j'ai besoin c'est:

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

Existe-t-il un moyen simple d'y parvenir?

66
Thaven

Oui, vous devez utiliser JsonSerializerSettings.NullValueHandling = NullValueHandling.Ignore.

Mais parce que les structures sont des types de valeur vous devez marquer Field2, Field3 nullable pour obtenir le résultat attendu:

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

Ou utilisez simplement des classes au lieu de structures.

Documentation: NullValueHandling, énumération

73
nemesv

Vous pouvez également appliquer l'attribut JsonProperty aux propriétés pertinentes et définir la valeur nulle de cette manière. Reportez-vous à la propriété Reference dans l'exemple ci-dessous:

Remarque: le JsonSerializerSettings remplacera les attributs.

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

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

    public string Name { get; set; }
}

Hth.

71
Jaans