在不更改模型名称的情况下,将xml反序列化重新设置为列表
本文关键字:新设置 反序列化 设置 列表 xml 模型 情况下 | 更新日期: 2023-09-27 17:49:22
我有xml,不是很好地形成,但需要映射到列表与RestSharp。我无法控制服务/xml输出。到目前为止,我能够使用DeserializeAs(Name="name")]
属性来解决属性本身的问题。例如,
public class Physician
{
[DeserializeAs(Name = "personId")]
public string Id { get; set; }
[DeserializeAs(Name = "fName")]
public string FirstName { get; set; }
[DeserializeAs(Name = "lName")]
public string LastName { get; set; }
}
正确映射到一个列表时,我有以下xml:
<data>
<physician>
<personId>3325</personId>
<fName>Foo</fName>
<lName>Bar</lName>
</physician>
<physician>
<personId>3342</personId>
<fName>Jane</fName>
<lName>Doe</lName>
</physician>
...
</data>
我使用的函数是:
public static List<T> GetListOfEntityType<T>(string url)
{
return Client.Execute<List<T>>(new RestRequest(url)).Data;
}
问题是,我的xml看起来像这样的许多其他请求,
<data>
<row>
<typeId>0</typeId>
<type>Physician</type>
</row>
<row>
<typeId>1</typeId>
<type>Ambulance</type>
</row>
...
</data>
给定它不是非常描述性的xml,但我需要将其映射到List。
public class OrganizationType
{
public string typeId { get; set; }
public string type { get; set; }
}
https://stackoverflow.com/a/4082046/3443716在某种程度上回答了这个问题,它当然有效,但我不希望模型被命名为row
,我尝试这样做:
[DeserializeAs(Name = "row")]
public class OrganizationType
{
public string typeId { get; set; }
public string type { get; set; }
}
然而,RestSharp试图完全忽略这个属性。我已经进行了大量的搜索,并找到了一些建议使用自定义反序列化器的答案,但我很难相信这是唯一或最简单的选择。是否还缺少其他属性,或者是否只有使用自定义反序列化器的选项?
作为另一个注意事项,我也试图做这样的事情,我只是得到null返回....
public class OrganizationType
{
public string typeId { get; set; }
public string type { get; set; }
}
public class OrgTypeCollection
{
[DeserializeAs(Name = "row")]
public List<OrganizationType> Names { get; set; }
}
多亏了这篇文章,https://stackoverflow.com/a/27643726我能够"分叉"RestSharp deserializer,并使用the Muffin Man提供的两行修改创建一个稍微自定义的,如下所示
将此添加到restsharp . deserializer . xmldeserializer中的HandleListDerivative
中,位于第344行。
var attribute = t.GetAttribute<DeserializeAsAttribute>();
if (attribute != null) name = attribute.Name;
这允许我按需要添加DeserializeAs
如下:
[DeserializeAs(Name = "row")]
public class OrganizationType
{
public string typeId { get; set; }
public string type { get; set; }
}
我不确定为什么这被restsharp忽略了,这似乎在许多情况下是有用的…顺便说一句,创建嵌套列表的功能仍然可用。虽然我没有在修改后运行测试,但它似乎完全符合您的期望。除此之外,您所要做的就是通过调用将自定义处理程序添加到restClient.AddHandler("application/xml", new CustomXmlDeserializer());