XML PortableRest 和 tvdb.com API 响应的反序列化器问题
XML Deserializer issues with PortableRest and tvdb.com API response
我只是尝试使用来自 tvdb.com 调用此 url: http://thetvdb.com/api/GetSeries.php?&seriesname=Homeland 的 REST api 调用的响应,这给了我这个 XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Data>
<Series>
<seriesid>247897</seriesid>
<SeriesName>Homeland</SeriesName>
</Series>
<Series>
<seriesid>84450</seriesid>
<SeriesName>Homeland Security USA</SeriesName>
</Series>
</Data>
我想使用具有通用异步方法的 PortableRest 库来调用 url 和 return 我的 类 的对象。在引擎盖下,PortableRest 使用 DataContractSerializer,它以某种方式在将此 XML 正确反序列化到我的对象时遇到问题。我相信我错过了一些属性,有人知道吗?这就是结果……看起来很奇怪。内容 属性 来自异步结果。
这些是我的 类:
[DataContract(Namespace = "")]
public class Data
{
[DataMember]
public IEnumerable<Series> Series { get; set; }
}
[DataContract(Namespace = "")]
public class Series
{
[DataMember(Name = "SeriesName")]
public string SeriesName { get; set; }
[DataMember(Name = "seriesid")]
public string SeriesId { get; set; }
}
var data = await restClient.SendAsync<Data>(request);
谢谢!
这里的问题是您的 Series
列表是一级格式而不是二级格式,但是 DataContractSerializer
不支持列表的一级格式。相反,它只支持像这样的两级格式:
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Series>
<Series>
<seriesid>247897</seriesid>
<SeriesName>Homeland</SeriesName>
</Series>
<Series>
...
</Series>
</Series>
</Data>
因此您需要使用以下 类 反序列化 XML:
[CollectionDataContract(Name="Data", Namespace="")]
public class SeriesList : List<Series>
{
}
[DataContract(Namespace = "")]
public class Series
{
[DataMember(Name = "seriesid", Order=0)]
public string SeriesId { get; set; }
[DataMember(Name = "SeriesName", Order=1)]
public string SeriesName { get; set; }
}
并像这样使用它:
var list = await restClient.SendAsync<SeriesList>(request);
var data = new Data { Series = list.ToList() };
顺便说一下,请注意 DataMemberAttribute.Order
property. Data contracts are sensitive to order 的使用,因此有必要通知序列化程序子 XML 元素出现的顺序。
我只是尝试使用来自 tvdb.com 调用此 url: http://thetvdb.com/api/GetSeries.php?&seriesname=Homeland 的 REST api 调用的响应,这给了我这个 XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Data>
<Series>
<seriesid>247897</seriesid>
<SeriesName>Homeland</SeriesName>
</Series>
<Series>
<seriesid>84450</seriesid>
<SeriesName>Homeland Security USA</SeriesName>
</Series>
</Data>
我想使用具有通用异步方法的 PortableRest 库来调用 url 和 return 我的 类 的对象。在引擎盖下,PortableRest 使用 DataContractSerializer,它以某种方式在将此 XML 正确反序列化到我的对象时遇到问题。我相信我错过了一些属性,有人知道吗?这就是结果……看起来很奇怪。内容 属性 来自异步结果。
这些是我的 类:
[DataContract(Namespace = "")]
public class Data
{
[DataMember]
public IEnumerable<Series> Series { get; set; }
}
[DataContract(Namespace = "")]
public class Series
{
[DataMember(Name = "SeriesName")]
public string SeriesName { get; set; }
[DataMember(Name = "seriesid")]
public string SeriesId { get; set; }
}
var data = await restClient.SendAsync<Data>(request);
谢谢!
这里的问题是您的 Series
列表是一级格式而不是二级格式,但是 DataContractSerializer
不支持列表的一级格式。相反,它只支持像这样的两级格式:
<Data xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Series>
<Series>
<seriesid>247897</seriesid>
<SeriesName>Homeland</SeriesName>
</Series>
<Series>
...
</Series>
</Series>
</Data>
因此您需要使用以下 类 反序列化 XML:
[CollectionDataContract(Name="Data", Namespace="")]
public class SeriesList : List<Series>
{
}
[DataContract(Namespace = "")]
public class Series
{
[DataMember(Name = "seriesid", Order=0)]
public string SeriesId { get; set; }
[DataMember(Name = "SeriesName", Order=1)]
public string SeriesName { get; set; }
}
并像这样使用它:
var list = await restClient.SendAsync<SeriesList>(request);
var data = new Data { Series = list.ToList() };
顺便说一下,请注意 DataMemberAttribute.Order
property. Data contracts are sensitive to order 的使用,因此有必要通知序列化程序子 XML 元素出现的顺序。