ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c#-Restsharp xml反序列化以列出而不更改模型名称

2019-11-20 09:06:51  阅读:369  来源: 互联网

标签:xml-deserialization restsharp deserialization xml c


我的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在某种程度上回答了这个问题,并且确实可以,但是我不希望将模型命名为行,我试图这样做:

[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并使用The Muffin Man提供的两行修改创建一个稍微自定义的,如下所示

将其添加到RestSharp.Deserializers.XmlDeserializer的344行的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会忽略它,在许多情况下这似乎很有用…作为一个侧面说明,创建嵌套列表的功能仍然可用.尽管修改后我还没有运行测试,但是它似乎完全可以满足您的期望.除此之外,您所要做的就是通过调用添加自定义处理程序以使其休息
Client.AddHandler(“ application / xml”,新的CustomXmlDeserializer());

标签:xml-deserialization,restsharp,deserialization,xml,c
来源: https://codeday.me/bug/20191120/2042984.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有