编程语言
首页 > 编程语言> > c#-Restsharp xml反序列化以列出而不更改模型名称

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

作者:互联网

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