繁体   English   中英

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

[英]Restsharp xml Deserialization to list without changing the name of model

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

感谢这篇文章, https: //stackoverflow.com/a/27643726我能够“分叉”RestSharp Deserialzier并创建一个稍微定制的一个,由Muffin Man提供的两行修改如下

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM