Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Deserialize JSON menjadi IEnumerable dengan Newtonsoft JSON.NET apabila BaseType adalah Abstrak?

Bagaimana untuk Deserialize JSON menjadi IEnumerable dengan Newtonsoft JSON.NET apabila BaseType adalah Abstrak?

DDD
DDDasal
2025-01-17 13:36:09950semak imbas

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

Gunakan Newtonsoft JSON.NET untuk menyahsiri JSON kepada IEnumerable

Apabila BaseType ialah kelas abstrak, mungkin sukar untuk menggunakan JsonConvert.Deserialize untuk menyahsiri data JSON kepada IEnumerable.

Soalan:

Pertimbangkan JSON berikut:

<code>[
  {
    "$id": "1",
    "$type": "MyAssembly.ClassA, MyAssembly",
    "Email": "[email\u00a0protected]"
  },
  {
    "$id": "2",
    "$type": "MyAssembly.ClassB, MyAssembly",
    "Email": "[email\u00a0protected]"
  }
]</code>

dan asas abstrak berikut dan kelas terbitan:

<code>public abstract class BaseClass
{
    public string Email;
}
public class ClassA : BaseClass
{
}
public class ClassB : BaseClass
{
}</code>

Apabila cuba menyahsiri JSON kepada:

<code>IEnumerable<基类> deserialized;</code>

Apabila menggunakan JsonConvert.Deserialize>(), anda akan menghadapi ralat kerana BaseClass adalah abstrak.

Penyelesaian:

Untuk menyelesaikan masalah ini, gunakan tetapan TypeNameHandling dalam JsonSerializerSettings. Dengan menetapkan tetapan ini kepada TypeNameHandling.All, maklumat jenis akan disertakan dalam JSON yang dinyahsiri.

<code>JsonSerializerSettings settings = new JsonSerializerSettings
{
    TypeNameHandling = TypeNameHandling.All
};

string strJson = JsonConvert.SerializeObject(instance, settings);</code>

JSON yang dikemas kini:

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

Deserialisasi kini berfungsi dengan betul selepas memasukkan maklumat jenis:

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

Atas ialah kandungan terperinci Bagaimana untuk Deserialize JSON menjadi IEnumerable dengan Newtonsoft JSON.NET apabila BaseType adalah Abstrak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn