首页 >后端开发 >C++ >当 BaseType 为 Abstract 时,如何使用 Newtonsoft JSON.NET 将 JSON 反序列化为 IEnumerable?

当 BaseType 为 Abstract 时,如何使用 Newtonsoft JSON.NET 将 JSON 反序列化为 IEnumerable?

DDD
DDD原创
2025-01-17 13:36:09950浏览

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

使用Newtonsoft JSON.NET将JSON反序列化到IEnumerable<基类>

当BaseType是抽象类时,使用JsonConvert.Deserialize将JSON数据反序列化到IEnumerable<基类>可能具有挑战性。

问题:

考虑以下JSON:

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

以及以下抽象基类和派生类:

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

当尝试将JSON反序列化为:

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

使用JsonConvert.Deserialize>()时,会遇到错误,因为BaseClass是抽象的。

解决方案:

为了解决这个问题,请在JsonSerializerSettings中使用TypeNameHandling设置。通过将此设置设置为TypeNameHandling.All,类型信息将包含在反序列化的JSON中。

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

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

更新后的JSON:

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

包含类型信息后,现在可以正确执行反序列化:

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

以上是当 BaseType 为 Abstract 时,如何使用 Newtonsoft JSON.NET 将 JSON 反序列化为 IEnumerable?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn