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.