654 votes

comment ignorer une propriété en classe si elle est nulle en utilisant json.net?

J'utilise Json.NET pour sérialiser une classe en json. J'ai la classe comme ça:

 class Test1
{
    [JsonProperty("id")]
    public string ID { get; set; }
    [JsonProperty("label")]
    public string Label { get; set; }
    [JsonProperty("url")]
    public string URL { get; set; }
    [JsonProperty("item")]
    public List<Test2> Test2List { get; set; }
}
 

Je veux ajouter un JsonIgnore() attribut Test2List propriété uniquement Test2List est nulle. Si ce n'est pas nul, je veux l'inclure dans mon json.

1149voto

sirthomas Points 928

Une solution alternative utilisant l'attribut JsonProperty :

 [JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
//or
[JsonProperty("property_name", NullValueHandling=NullValueHandling.Ignore)]
 

Comme vu dans ce doc en ligne .

818voto

Mrchief Points 25418

Selon James Newton King: Si vous créez le sérialiseur vous-même plutôt que d'utiliser JavaScriptConvert, il y a une propriété NullValueHandling que vous pouvez définir pour ignorer.

Voici un exemple:

 JsonSerializer _jsonWriter = new JsonSerializer
            {
                NullValueHandling = NullValueHandling.Ignore
            };
 

74voto

Toby J Points 942

Similaire à @sirthomas réponse, JSON.NET respecte aussi l' EmitDefaultValue propriété sur DataMemberAttribute:

[DataMember(Name="property_name", EmitDefaultValue=false)]

Cela peut être utile si vous utilisez déjà [DataContract] et [DataMember] dans votre modèle, type et ne voulez pas ajouter de JSON.NET-des attributs particuliers.

12voto

Mickey Perlstein Points 642

Comme on peut le voir sur ce lien sur leur site (http://james.newtonking.com/archive/2009/10/23/efficient-json-with-json-net-reducing-serialized-json-size.aspx) I supporte l'utilisation de [Default ()] pour spécifier les valeurs par défaut

Tiré du lien

    public class Invoice
{
  public string Company { get; set; }
  public decimal Amount { get; set; }

  // false is default value of bool
  public bool Paid { get; set; }
  // null is default value of nullable
  public DateTime? PaidDate { get; set; }

  // customize default values
  [DefaultValue(30)]
  public int FollowUpDays { get; set; }
  [DefaultValue("")]
  public string FollowUpEmailAddress { get; set; }
}


Invoice invoice = new Invoice
{
  Company = "Acme Ltd.",
  Amount = 50.0m,
  Paid = false,
  FollowUpDays = 30,
  FollowUpEmailAddress = string.Empty,
  PaidDate = null
};

string included = JsonConvert.SerializeObject(invoice,
  Formatting.Indented,
  new JsonSerializerSettings { });

// {
//   "Company": "Acme Ltd.",
//   "Amount": 50.0,
//   "Paid": false,
//   "PaidDate": null,
//   "FollowUpDays": 30,
//   "FollowUpEmailAddress": ""
// }

string ignored = JsonConvert.SerializeObject(invoice,
  Formatting.Indented,
  new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore });

// {
//   "Company": "Acme Ltd.",
//   "Amount": 50.0
// }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X