Désérialiser de manière à ce qu’un champ soit une liste vide plutôt que nulle

Si j’ai un cours comme celui-ci:

[DataContract(Name = "", Namespace = "")] public class MyDataObject { [DataMember(Name = "NeverNull")] public IList MyInts { get; set; } } 

Est-il possible de faire en sorte que le champ MyInts devienne une liste vide non nulle lorsque la chaîne suivante est désérialisée?

 ssortingng serialized = @"{""NeverNull"":null}"; MyDataObject myDataObject = JsonConvert.DeserializeObject(serialized); 

J’utilise Newtonsoft.Json

La raison pour laquelle je pose cette question est que j’ai une requête json assez complexe à parsingr, elle contient des nids de listes d’objects et je voudrais que le code de désérialisation crée ces objects afin d’éviter de nombreuses vérifications nulles:

 if (foo.bar != null) { foreach (var bar in foo.bar) { if (bar.baz != null) { foreach (var baz in bar.baz) { ... 

Peut-être append un rappel post-sérialisation qui vérifie cela à la fin de la désérialisation?

 [DataContract(Name = "", Namespace = "")] public class MyDataObject { [OnDeserialized] public void OnDeserialized(StreamingContext context) { if (MyInts == null) MyInts = new List(); } [DataMember(Name = "NeverNull")] public IList MyInts { get; set; } } 

Notez également que JsonConvert (à la différence de DataContractSerializer ) exécute le constructeur par défaut. Vous pouvez donc généralement append un constructeur par défaut:

  public MyDataObject() { MyInts = new List(); } 

cependant, dans ce cas, l’ exploit "NeverNull":null le remet à null pendant la désérialisation, d’où la raison pour laquelle j’ai utilisé un rappel précédemment

L’initialisation de IList avec new int[0] vous aidera! C’est la solution qui me donne les meilleurs résultats.