Deserialize a Listlt;AbstractClassgt; with newtonsoft.json(反序列化列表lt;AbstractClassgt;使用 newtonsoft.json)
问题描述
我正在尝试序列化和反序列化 abstract
类列表(mustinherit
for vb),显然其中只有派生类的实例.
i'm trying to serialize and deserialize a list of abstract
classes (mustinherit
for vb), obviusly inside it there are only instances of derived classes.
我用 JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)
修饰了列表参数,获得如下所示的输出:
I've decorated the list parameter with the JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)
obtaining an output that look like this:
但是当我反序列化它时一直说他不能反序列化抽象类.
But when i deserialize it keep saying that he cannot deserialize an abstract class.
http://james.newtonking.com/json/help/index.html?topic=html/SerializeTypeNameHandling.htm
public class ConcreteClass
{
private ObservableCollection<AbstractClass> _Nodes = new ObservableCollection<AbstractClass>();
//<Newtonsoft.Json.JsonProperty(itemtypenamehandling:=Newtonsoft.Json.TypeNameHandling.Auto)>
public ObservableCollection<AbstractClass> Nodes {
get { return this._Nodes; }
}
public string Name { get; set; }
public int Id { get; set; }
}
public abstract class AbstractClass
{
private ObservableCollection<AbstractClass> _Nodes = new ObservableCollection<AbstractClass>();
[Newtonsoft.Json.JsonProperty(itemtypenamehandling = Newtonsoft.Json.TypeNameHandling.Auto)]
public ObservableCollection<AbstractClass> Nodes {
get { return this._Nodes; }
}
}
删除它的注释行!
推荐答案
确保在反序列化时指定 TypeNameHandling,按照文档:
Make sure you specify TypeNameHandling when deserializing, as per the docs:
// for security TypeNameHandling is required when deserializing
Stockholder newStockholder = JsonConvert.DeserializeObject<Stockholder>(jsonTypeNameAuto, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto
});
值得注意的是,文档正在反序列化一个包含抽象类集合的具体类.
It is worth noting that the documentation is deserializing a Concrete class that contains a collection of Abstract classes.
作为一个实验,尝试创建一个一次性类(具体),该类具有一个包含抽象对象列表的单一属性,并查看是否可以对其进行序列化和反序列化.
As an experiment try creating a throw-away class (concrete) that has a single property with your list of abstract objects and see if you can serialize and deserialize that.
更新:
我刚刚在 LINQPad 中测试了以下代码:
I just tested the following code in LINQPad:
void Main()
{
var test = new List<Business>();
test.Add(new Hotel { Name = "Hilton", Stars = 5 });
test.Add(new Pool { Name = "Big Splash", Capacity = 500 });
test.Dump();
string json = JsonConvert.SerializeObject(test, Newtonsoft.Json.Formatting.Indented, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
json.Dump();
var businesses = JsonConvert.DeserializeObject<List<Business>>(json, new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All
});
businesses.Dump();
}
// Define other methods and classes here
public abstract class Business
{
public string Name { get;set; }
}
public class Hotel : Business
{
public int Stars { get;set; }
}
public class Pool : Business
{
public int Capacity { get;set;}
}
效果很好.抽象集合序列化为:
It worked perfectly. Abstract collection serialized to:
{
"$type": "System.Collections.Generic.List`1[[UserQuery+Business, query_jvrdcu]], mscorlib",
"$values": [
{
"$type": "UserQuery+Hotel, query_jvrdcu",
"Stars": 5,
"Name": "Hilton"
},
{
"$type": "UserQuery+Pool, query_jvrdcu",
"Capacity": 500,
"Name": "Big Splash"
}
]
}
原始集合和反序列化集合匹配.
The original and the deserialized collections matched.
这篇关于反序列化列表<AbstractClass>使用 newtonsoft.json的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:反序列化列表<AbstractClass>使用 newtonsoft.json
基础教程推荐
- 将 XML 转换为通用列表 2022-01-01
- 将 Office 安装到 Windows 容器 (servercore:ltsc2019) 失败,错误代码为 17002 2022-01-01
- rabbitmq 的 REST API 2022-01-01
- 如何激活MC67中的红灯 2022-01-01
- 如何在 IDE 中获取 Xamarin Studio C# 输出? 2022-01-01
- 为什么Flurl.Http DownloadFileAsync/Http客户端GetAsync需要 2022-09-30
- MS Visual Studio .NET 的替代品 2022-01-01
- SSE 浮点算术是否可重现? 2022-01-01
- 有没有办法忽略 2GB 文件上传的 maxRequestLength 限制? 2022-01-01
- c# Math.Sqrt 实现 2022-01-01