使用RestSharp对类位于类型属性中的对象进行反序列化
本文关键字:属性 对象 反序列化 类型 RestSharp 于类型 使用 | 更新日期: 2023-09-27 18:18:19
我正在尝试从rest api消费数据。我需要使用RestSharp从rest API反序列化对象。列表中的所有对象都是"object"元素,对象的类是"type"属性的值。
下面是我的意思的一个例子:
<list>
<object type="cat">
<id>107</id>
<name>Garry</name>
</object>
<object type="dog">
<id>83</id>
<name>Fluffy</name>
</object>
</list>
和部分实现的类:
public class Animal
{
public long Id { get; set; }
public string Name { get; set; }
}
[DeserializeAs(Name = "cat")]
public class Cat : Animal
{
}
[DeserializeAs(Name = "dog")]
public class Dog : Animal
{
}
这似乎是错误的方式去,但尝试定义我所有的类使用属性:
[DeserializeAs(Name = "object")]
这允许它们正确地反序列化,只要我知道列表中期望的对象类型,显然列表只包含一种类型的对象。
如果我得到一个包含不同类型对象的列表,问题就出现了。
有没有一种方法可以很好地使用标准反序列化器来处理这个问题?如果没有,我愿意用大量不同的对象类型来有效地处理这个问题。
我查看了标准的反序列化器。我很确定它不是用来处理这种情况的。最后我做了自己的叉子。
我添加了另一个属性用于在列表中描述对象:
[DeserializeElementAs(Name = "", Attribute = "", Value = "")]
属性名可能不是最好的,但我不确定该怎么称呼它。
问题中xml的类定义为:
public class Animal
{
public long Id { get; set; }
public string Name { get; set; }
}
[DeserializeElementAs(Name = "object", Attribute = "type", Value = "cat")]
[DeserializeAs(Name = "cat")]
public class Cat : Animal
{
}
[DeserializeElementAs(Name = "object", Attribute = "type", Value = "dog")]
[DeserializeAs(Name = "dog")]
public class Dog : Animal
{
}
我把分叉的代码发布到github上,如果有人需要的话。
https://github.com/comless/RestSharp/commit/1fea0fd97cadc7035dbea99c17b7423ca14b5267