Restsharp xml反序列化到列表而不更改模型

时间:2015-05-17 02:55:25

标签: c# xml deserialization restsharp xml-deserialization

我的xml格式不是很好,但是需要使用RestSharp映射到List。我无法控制service / 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似乎完全忽略了这个属性。我一直在搜索,并找到了一些建议使用自定义反序列化器的答案,但我很难相信这是唯一或最简单的选择。是否有其他属性我可能会丢失或是使用自定义反序列化器的唯一选项?

另外一点,我也尝试做过这样的事情,我只是回来了......

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; }
}

1 个答案:

答案 0 :(得分:3)

感谢这篇文章,https://stackoverflow.com/a/27643726我能够&#34; fork&#34; RestSharp Deserialzier并使用The Muffin Man提供的两行修改创建一个稍微自定义的,如下所示

将此添加到第{344行RestSharp.Deserializers.XmlDeserializer中的HandleListDerivative

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忽略,这似乎在许多情况下会有用......作为旁注,创建嵌套列表的功能仍然可用。虽然我没有经过修改后运行测试,但它似乎完全符合您的预期。除此之外,你所要做的就是通过callling添加自定义处理程序 Client.AddHandler("application/xml", new CustomXmlDeserializer());