Utilisation de Newtonsoft.Json.NET pour désérialiser JSON dans une collection IEnumerable
Défi :
La désérialisation de données JSON complexes dans un IEnumerable<BaseType>
où BaseType
est abstrait présente des difficultés. La norme JsonConvert.DeserializeObject
échoue à cause du type de base abstrait.
Résolution :
La solution consiste à tirer parti de JsonSerializerSettings
et de sa TypeNameHandling
propriété. La définition de TypeNameHandling
sur All
garantit que le JSON sérialisé inclut des champs $type
, préservant ainsi les informations de type cruciales pour la désérialisation.
Étapes de mise en œuvre :
JsonSerializerSettings
et définissez TypeNameHandling
sur All
.<code class="language-csharp">JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All };</code>
$type
champs nécessaires à la chaîne JSON.<code class="language-csharp">string strJson = JsonConvert.SerializeObject(instance, settings);</code>
Le JSON résultant ressemblera à ceci (notez les $type
champs) :
<code class="language-json">{ "$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>
IEnumerable<BaseType>
en utilisant le même objet settings
.<code class="language-csharp">IEnumerable<BaseType> deserialized = JsonConvert.DeserializeObject<IEnumerable<BaseType>>(strJson, settings);</code>
Documentation pertinente :
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!