首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从GreatSchool API响应反序列化

如何从GreatSchool API响应反序列化
EN

Stack Overflow用户
提问于 2015-10-02 04:32:41
回答 2查看 83关注 0票数 0

我必须从XML (greatschool )反序列化到类域。

网址:http://www.greatschools.org/api/docs/nearbySchools.page

XML:

代码语言:javascript
复制
<schools>
<school>
<gsId>936</gsId>
<name>Centerville Elementary</name>
<type>public</type>
<gradeRange>K-6</gradeRange>
...
</schools>

我创建了像这样的DOMain来进行转换

代码语言:javascript
复制
[Serializable()]
   [System.Xml.Serialization.XmlRoot("schools")]
   public class SchoolResponse
   {
       [XmlArray("schools")]
       [XmlArrayItem("school", typeof(School))]
       public School[] school { get; set; }
   }
 [Serializable()]
   public class School
   {
       [System.Xml.Serialization.XmlElement("gsId")]
       public string GSId { get; set; }
        [System.Xml.Serialization.XmlElement("name")]
       public string Name { get; set; }
....
}

调用方法:

代码语言:javascript
复制
 var url = new Uri(this.BaseUri, request.ToUri());
            return Internal.Http.Get(url,"XML").As<SchoolResponse>();
...

public virtual T As<T>() where T : class
            {
                T output = null;

                using (var reader = GetStreamReader(this.RequestUri))
                {
                        XmlSerializer serializer = new XmlSerializer(typeof(T));
                        output = (T)serializer.Deserialize(reader);
                }
               return output;
            }

它返回为null。请帮帮忙

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-02 04:41:13

问题在于school数组属性。尝尝这个

代码语言:javascript
复制
[Serializable()]
[System.Xml.Serialization.XmlRoot("schools")]
public class SchoolResponse
{
   [XmlElement("school")]
   public School[] school { get; set; }
}

通常,C# XML喜欢有一个数组名称元素,然后为每个数组值设置一个元素。通过在数组上使用[XmlElement],不会生成外部元素。

票数 1
EN

Stack Overflow用户

发布于 2015-10-02 08:51:00

如我所见,学校类型的有效值是:“公共”、“宪章”、“私有”或任何由连字符分隔的组合,如“公共宪章”,我认为最好的变体是这样声明枚举类型:

代码语言:javascript
复制
public enum SchoolType
{
    [XmlEnum("public")]
    Public,
    [XmlEnum("charter")]
    Charter,
    [XmlEnum("private")]
    Private,
    [XmlEnum("public-charter")]
    PublicCharter,
    [XmlEnum("public-private")]
    PublicPrivate,
    [XmlEnum("private-charter")]
    PrivateCharter,
    [XmlEnum("public-charter-private")]
    PublicCharterPrivate
}

然后您的类定义将如下所示:

代码语言:javascript
复制
[Serializable]
public class School
{
    [XmlElement("gsId")] //Custom property name
    public string GSId { get; set; } //The same property name
    public string name { get; set; }
    public string type { get; set; }
    public string gradeRange { get; set; }
    [XmlElement("schoolType")] //Enum declaration
    public SchoolType SchoolType { get; set; }
}

但是你也应该检查所有的变体

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32900586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档