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 souhaite ajouter un attribut JsonIgnore()
à la propriété Test2List
uniquement lorsque Test2List
est null
. Si ce n'est pas nul alors je veux l'inclure dans mon json.
Selon James Newton King: Si vous créez le sérialiseur vous-même plutôt que d'utiliser JavaScriptConvert, il existe une propriété NullValueHandling
que vous pouvez définir pour l'ignorer.
Voici un exemple:
JsonSerializer _jsonWriter = new JsonSerializer {
NullValueHandling = NullValueHandling.Ignore
};
Alternativement, comme suggéré par @amit
JsonConvert.SerializeObject(myObject,
Newtonsoft.Json.Formatting.None,
new JsonSerializerSettings {
NullValueHandling = NullValueHandling.Ignore
});
Une autre solution utilisant l'attribut JsonProperty
:
[JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
// or
[JsonProperty("property_name", NullValueHandling=NullValueHandling.Ignore)]
// or for all properties in a class
[JsonObject(ItemNullValueHandling = NullValueHandling.Ignore)]
Comme on le voit dans ce document en ligne .
Semblable à la réponse de @ sirthomas, JSON.NET respecte également la propriété EmitDefaultValue
sur DataMemberAttribute
:
[DataMember(Name="property_name", EmitDefaultValue=false)]
Cela peut être souhaitable si vous utilisez déjà [DataContract]
et [DataMember]
dans votre type de modèle et ne souhaitez pas ajouter d'attributs spécifiques à JSON.NET.
Vous pouvez écrire: [JsonProperty("property_name",DefaultValueHandling = DefaultValueHandling.Ignore)]
Il prend également soin de ne pas sérialiser les propriétés avec les valeurs par défaut (pas seulement null). Cela peut être utile pour des enums par exemple.
Vous pouvez le faire pour ignorer toutes les valeurs NULL dans un objet que vous sérialisez. Aucune propriété NULL n'apparaîtra alors dans le fichier JSON.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.NullValueHandling = NullValueHandling.Ignore;
var myJson = JsonConvert.SerializeObject(myObject, settings);
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
// }
Une adaptation à la réponse de @ Mrchief/@ amit, mais pour les personnes utilisant VB
Dim JSONOut As String = JsonConvert.SerializeObject(
myContainerObject,
New JsonSerializerSettings With {
.NullValueHandling = NullValueHandling.Ignore
}
)
Voir: "Initialiseurs d'objet: Types nommés et anonymes (Visual Basic)"
Pour expliquer légèrement la réponse très utile de GlennG (traduire la syntaxe de C # en VB.Net n’est pas toujours "évident"), vous pouvez également décorer des propriétés de classe individuelles pour gérer le traitement des valeurs NULL. Si vous faites cela, n'utilisez pas la suggestion globale de JsonSerializerSettings de GlennG, sinon elle remplacera les décorations individuelles. Cela s'avère pratique si vous souhaitez qu'un élément null apparaisse dans le code JSON afin que le consommateur n'ait pas à effectuer de traitement spécial. Si, par exemple, le consommateur doit savoir qu'un tableau d'éléments facultatifs est normalement disponible, mais qu'il est actuellement vide ... La décoration dans la déclaration de propriété ressemble à ceci:
<JsonPropertyAttribute("MyProperty", DefaultValueHandling:=NullValueHandling.Include)> Public Property MyProperty As New List(of String)
Pour les propriétés que vous ne souhaitez pas voir apparaître dans la modification JSON : = = NullValueHandling.Include à : = NullValueHandling.Ignore. Soit dit en passant, j'ai constaté que vous pouviez très bien décorer une propriété pour la sérialisation XML et JSON (placez-les juste les unes à côté des autres). Cela me donne la possibilité d'appeler le sérialiseur XML dans dotnet ou le sérialiseur NewtonSoft à volonté. Les deux fonctionnent côte à côte et mes clients ont la possibilité de travailler avec XML ou JSON. C'est lisse comme une morue sur une poignée de porte depuis que j'ai des clients qui exigent les deux!
Voici une option similaire, mais offrant un autre choix:
public class DefaultJsonSerializer : JsonSerializerSettings
{
public DefaultJsonSerializer()
{
NullValueHandling = NullValueHandling.Ignore;
}
}
Ensuite, je l'utilise comme ceci:
JsonConvert.SerializeObject(postObj, new DefaultJsonSerializer());
La différence ici est que:
JsonSerializerSettings
à chaque endroit où il est utilisé.En .Net Core, c'est beaucoup plus facile maintenant. Dans votre startup.cs, ajoutez simplement les options JSON et vous pourrez y configurer les paramètres.
public void ConfigureServices(IServiceCollection services)
....
services.AddMvc().AddJsonOptions(options =>
{
options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
Avec Json.NET
public class Movie
{
public string Name { get; set; }
public string Description { get; set; }
public string Classification { get; set; }
public string Studio { get; set; }
public DateTime? ReleaseDate { get; set; }
public List<string> ReleaseCountries { get; set; }
}
Movie movie = new Movie();
movie.Name = "Bad Boys III";
movie.Description = "It's no Bad Boys";
string ignored = JsonConvert.SerializeObject(movie,
Formatting.Indented,
new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });
Le résultat sera:
{
"Name": "Bad Boys III",
"Description": "It's no Bad Boys"
}