我的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://*.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://*.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());