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(); 

これはAPIのXML応答です。

<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

あなた、それらのvariabl名前は恐ろしいです。 –

+0

ちょっと、これは変数名の判定フリーゾーンです。それぞれ独自に。 –

答えて

1

あなたのデータコントラクトは、間違った方法

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

に構築されている。これは、あなたのXMLは同じでVERSIONのために行く、この

<?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> 
    ... 

のように見えると仮定します。 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); 
     } 
    } 
} 

この

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

これは機能しました!ありがとうございました! –

関連する問題