Heim > Backend-Entwicklung > C++ > Wie deserialisiere ich JSON mit Newtonsoft JSON.NET in ein IEnumerable, wenn BaseType Abstract ist?

Wie deserialisiere ich JSON mit Newtonsoft JSON.NET in ein IEnumerable, wenn BaseType Abstract ist?

DDD
Freigeben: 2025-01-17 13:36:09
Original
947 Leute haben es durchsucht

How to Deserialize JSON into an IEnumerable with Newtonsoft JSON.NET when BaseType is Abstract?

Verwenden Sie Newtonsoft JSON.NET, um JSON in IEnumerable zu deserialisieren.

Wenn BaseType eine abstrakte Klasse ist, kann es schwierig sein, JsonConvert.Deserialize zum Deserialisieren von JSON-Daten in IEnumerable zu verwenden.

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Beim Versuch, JSON zu deserialisieren in:

<code>IEnumerable<基类> deserialized;</code>
Nach dem Login kopieren

Bei der Verwendung von JsonConvert.Deserialize>() treten Fehler auf, da BaseClass abstrakt ist.

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Deserialisierung wird jetzt korrekt ausgeführt, nachdem Typinformationen eingefügt wurden:

<code>IEnumerable<BaseClass> obj = JsonConvert.DeserializeObject<IEnumerable<BaseClass>>(strJson, settings);</code>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage