在不更改模型名称的情况下,将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; }
}

在不更改模型名称的情况下,将xml反序列化重新设置为列表

多亏了这篇文章,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());