Maison >développement back-end >C++ >Comment désérialiser JSON en IEnumerable avec Newtonsoft JSON.NET lorsque BaseType est Abstract ?
Lorsque BaseType est une classe abstraite, il peut être difficile d'utiliser JsonConvert.Deserialize pour désérialiser les données JSON en IEnumerable
Question :
Considérez le JSON suivant :
<code>[ { "$id": "1", "$type": "MyAssembly.ClassA, MyAssembly", "Email": "[email\u00a0protected]" }, { "$id": "2", "$type": "MyAssembly.ClassB, MyAssembly", "Email": "[email\u00a0protected]" } ]</code>
et les classes de base abstraites et dérivées suivantes :
<code>public abstract class BaseClass { public string Email; } public class ClassA : BaseClass { } public class ClassB : BaseClass { }</code>
Lorsque vous essayez de désérialiser JSON vers :
<code>IEnumerable<基类> deserialized;</code>
Lorsque vous utilisez JsonConvert.Deserialize
Solution :
Pour résoudre ce problème, utilisez le paramètre TypeNameHandling dans JsonSerializerSettings. En définissant ce paramètre sur TypeNameHandling.All, les informations de type seront incluses dans le JSON désérialisé.
<code>JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; string strJson = JsonConvert.SerializeObject(instance, settings);</code>
JSON mis à jour :
<code>{ "$type": "System.Collections.Generic.List`1[[MyAssembly.BaseClass, MyAssembly]], mscorlib", "$values": [ { "$id": "1", "$type": "MyAssembly.ClassA, MyAssembly", "Email": "[email\u00a0protected]", }, { "$id": "2", "$type": "MyAssembly.ClassB, MyAssembly", "Email": "[email\u00a0protected]", } ] }</code>
La désérialisation s'effectue désormais correctement après avoir inclus les informations de type :
<code>IEnumerable<BaseClass> obj = JsonConvert.DeserializeObject<IEnumerable<BaseClass>>(strJson, settings);</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!