2016-11-16 9 views
0

Я пытаюсь десериализовать ответ API в объект, но объект продолжает возвращать NULL. Я не могу понять. Я чувствую, что мне что-то не хватает.XML - десериализация в объект

Здесь C# десериализовать код.

 var request = (HttpWebRequest)HttpWebRequest.Create(uri + data); 
     var response = (HttpWebResponse)request.GetResponse(); 
     var reader = new StreamReader(response.GetResponseStream()); 

     PICKUPREQUESTRESPONSE PICKUPREQUESTRESPONSE = null; 

     XmlSerializer serializer = new XmlSerializer(typeof(PICKUPREQUESTRESPONSE)); 


     PICKUPREQUESTRESPONSE = (PICKUPREQUESTRESPONSE)serializer.Deserialize(reader); 
     reader.Close(); 

это XML-ответ API.

<PICKUPREQUESTRESPONSE xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> 
<STATUS> 
    <CODE>1</CODE> 
    <VIEW>ERROR</VIEW> 
    <ERRORTYPE>INPUT_ERROR</ERRORTYPE> 
    <MESSAGE>Testing Mode: You have passed input validation, the pickup request has NOT been submitted</MESSAGE> 
    <VERSION> 
     <CURRENT>V3X1</CURRENT> 
     <CURRENT_RELEASE_DATE>03/01/2014</CURRENT_RELEASE_DATE> 
     <LATEST>V3X1</LATEST> 
     <LATEST_RELEASE_DATE>03/01/2014</LATEST_RELEASE_DATE> 
    </VERSION> 
</STATUS> 
</PICKUPREQUESTRESPONSE> 

вот объект C#, который я создал.

[Serializable()] 
[System.Xml.Serialization.XmlRoot("PICKUPREQUESTRESPONSE")] 
public class PICKUPREQUESTRESPONSE 
{ 
    [XmlArray("PICKUPREQUESTRESPONSE")] 
    [XmlArrayItem("STATUS", typeof(STATUS))] 
    public STATUS[] STATUS { get; set; } 
} 


[Serializable()] 
public class STATUS 
{ 
    [XmlElement("CODE")] 
    public string CODE { get; set; } 

    [XmlElement("VIEW")] 
    public string VIEW { get; set; } 

    [XmlElement("ERRORTYPE")] 
    public string ERRORTYPE { get; set; } 

    [XmlElement("MESSAGE")] 
    public string MESSAGE { get; set; } 

    [XmlArrayItem("VERSION", typeof(VERSION))] 
    public VERSION[] VERSION { get; set; } 

} 

[Serializable()] 
public class VERSION 
{ 
    [System.Xml.Serialization.XmlElement("CURRENT")] 
    public string CURRENT { get; set; } 

    [System.Xml.Serialization.XmlElement("CURRENT_RELEASE_DATE")] 
    public string CURRENT_RELEASE_DATE { get; set; } 

    [System.Xml.Serialization.XmlElement("LATEST")] 
    public string LATEST { get; set; } 

    [System.Xml.Serialization.XmlElement("LATEST_RELEASE_DATE")] 
    public string LATEST_RELEASE_DATE { get; set; } 

} 
+0

Экранированный ' \ "' выглядят странно для меня, я сомневаюсь, что вам понадобятся те, просто используйте '=" ... "'. – HimBromBeere

+2

Чувак, эти переменные e имена ужасны. Изучите некоторые соглашения об именах –

+0

эй, это свободная от суждения зона с именами переменных. Каждому свое. –

ответ

1

Ваши контракты данных построены в неправильном направлении

public class PICKUPREQUESTRESPONSE 
{ 
    [XmlArray("PICKUPREQUESTRESPONSE")] 
    [XmlArrayItem("STATUS", typeof(STATUS))] 
    public STATUS[] STATUS { get; set; } 
} 

Это предположим, что ваш XML выглядит следующим образом

<?xml version="1.0" encoding="utf-16"?> 
<PICKUPREQUESTRESPONSE xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <PICKUPREQUESTRESPONSE> 
    ... 

То же самое касается VERSION. Указав XmlArray и XmlArrayItem, он ожидает вложенные экземпляры элементов, которые не были у вашего образца xml.

объекты ниже должны работать

[Serializable()] 
[System.Xml.Serialization.XmlRoot("PICKUPREQUESTRESPONSE")] 
public class PICKUPREQUESTRESPONSE 
{ 
    //[XmlArray("PICKUPREQUESTRESPONSE")] 
    //[XmlArrayItem("STATUS", typeof(STATUS))] 
    [XmlElement("STATUS")] 
    public STATUS[] STATUS { get; set; } 
} 


[Serializable()] 
public class STATUS 
{ 
    [XmlElement("CODE")] 
    public string CODE { get; set; } 

    [XmlElement("VIEW")] 
    public string VIEW { get; set; } 

    [XmlElement("ERRORTYPE")] 
    public string ERRORTYPE { get; set; } 

    [XmlElement("MESSAGE")] 
    public string MESSAGE { get; set; } 

    //[XmlArrayItem("VERSION", typeof(VERSION))] 
    [XmlElement("VERSION")] 
    public VERSION[] VERSION { get; set; } 

} 

[Serializable()] 
public class VERSION 
{ 
    [System.Xml.Serialization.XmlElement("CURRENT")] 
    public string CURRENT { get; set; } 

    [System.Xml.Serialization.XmlElement("CURRENT_RELEASE_DATE")] 
    public string CURRENT_RELEASE_DATE { get; set; } 

    [System.Xml.Serialization.XmlElement("LATEST")] 
    public string LATEST { get; set; } 

    [System.Xml.Serialization.XmlElement("LATEST_RELEASE_DATE")] 
    public string LATEST_RELEASE_DATE { get; set; } 

} 

Я также рекомендую использовать стандартный шаблон для XML-сериализации, что-то вроде этого

/// <summary> 
/// Deserialize an xml string to type T 
/// </summary> 
/// <typeparam name="T"></typeparam> 
/// <param name="xml"></param> 
/// <returns></returns> 
public static T Deserialize<T>(string xml) 
{ 
    if (string.IsNullOrEmpty(xml)) 
     return default(T); 

    XmlSerializer serializer = new XmlSerializer(typeof(T)); 

    XmlReaderSettings settings = new XmlReaderSettings(); 
    // No settings need modifying here 

    using (StringReader textReader = new StringReader(xml)) 
    { 
     using (XmlReader xmlReader = XmlReader.Create(textReader, settings)) 
     { 
      return (T)serializer.Deserialize(xmlReader); 
     } 
    } 
} 

Invoke это так

var resp = Deserialize<PICKUPREQUESTRESPONSE>(thexml); 
+0

это сработало! Спасибо! –

Смежные вопросы