使用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")]

这允许它们正确地反序列化,只要我知道列表中期望的对象类型,显然列表只包含一种类型的对象。

如果我得到一个包含不同类型对象的列表,问题就出现了。

有没有一种方法可以很好地使用标准反序列化器来处理这个问题?如果没有,我愿意用大量不同的对象类型来有效地处理这个问题。

使用RestSharp对类位于类型属性中的对象进行反序列化

我查看了标准的反序列化器。我很确定它不是用来处理这种情况的。最后我做了自己的叉子。

我添加了另一个属性用于在列表中描述对象:

[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

相关文章: