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
DDDOriginal
2025-01-17 13:36:09950Durchsuche

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>

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>() 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>

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!

Stellungnahme:
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