Wenn BaseType eine abstrakte Klasse ist, kann es schwierig sein, JsonConvert.Deserialize zum Deserialisieren von JSON-Daten in IEnumerable
Frage:
Berücksichtigen Sie den folgenden JSON:
<code>[ { "$id": "1", "$type": "MyAssembly.ClassA, MyAssembly", "Email": "[email\u00a0protected]" }, { "$id": "2", "$type": "MyAssembly.ClassB, MyAssembly", "Email": "[email\u00a0protected]" } ]</code>
und die folgenden abstrakten Basis- und abgeleiteten Klassen:
<code>public abstract class BaseClass { public string Email; } public class ClassA : BaseClass { } public class ClassB : BaseClass { }</code>
Beim Versuch, JSON zu deserialisieren in:
<code>IEnumerable<基类> deserialized;</code>
Bei der Verwendung von JsonConvert.Deserialize
Lösung:
Um dieses Problem zu lösen, verwenden Sie die TypeNameHandling-Einstellung in JsonSerializerSettings. Durch Festlegen dieser Einstellung auf TypeNameHandling.All werden Typinformationen in das deserialisierte JSON aufgenommen.
<code>JsonSerializerSettings settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.All }; string strJson = JsonConvert.SerializeObject(instance, settings);</code>
JSON aktualisiert:
<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>
Deserialisierung wird jetzt korrekt ausgeführt, nachdem Typinformationen eingefügt wurden:
<code>IEnumerable<BaseClass> obj = JsonConvert.DeserializeObject<IEnumerable<BaseClass>>(strJson, settings);</code>
Das obige ist der detaillierte Inhalt vonWie deserialisiere ich JSON mit Newtonsoft JSON.NET in ein IEnumerable, wenn BaseType Abstract ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!