3

나는 다음과 같은 구글의 지오 코딩 XML역 직렬화 구글 지오 코딩 XML

<GeocodeResponse> 
<status>OK</status> 
<result> 
    <type>street_address</type> 
    <formatted_address>1600 Amphitheatre Pkwy, Mountain View, CA 94043, USA</formatted_address> 
    <address_component> 
    <long_name>1600</long_name> 
    <short_name>1600</short_name> 
    <type>street_number</type> 
    </address_component> 
    <address_component> 
    <long_name>Amphitheatre Pkwy</long_name> 
    <short_name>Amphitheatre Pkwy</short_name> 
    <type>route</type> 
    </address_component> 
    .... 
    <geometry> 
    <location> 
    <lat>37.4217550</lat> 
    <lng>-122.0846330</lng> 
    </location> 
    <location_type>ROOFTOP</location_type> 
    <viewport> 
    <southwest> 
    <lat>37.4188514</lat> 
    <lng>-122.0874526</lng> 
    </southwest> 
    <northeast> 
    <lat>37.4251466</lat> 
    <lng>-122.0811574</lng> 
    </northeast> 
    </viewport> 
    </geometry> 
</result> 
</GeocodeResponse> 

그리고 다음과 같은 개체가

[DataContract(Namespace = "")] 
public class GeocodeResponse 
{ 
    [DataMember(Name = "status", Order = 1)] 
    public string Status { get; set; } 

    [DataMember(Name = "result", Order = 2)] 
    public List<Result> Results { get; set; } 

    [DataContract(Name = "result", Namespace = "")] 
    public class Result 
    { 
     [DataMember(Name = "geometry")] 
     public CGeometry Geometry { get; set; } 

     [DataContract(Name = "geometry", Namespace = "")] 
     public class CGeometry 
     { 
      [DataMember(Name = "location")] 
      public CLocation Location { get; set; } 

      [DataContract(Name = "location", Namespace = "")] 
      public class CLocation 
      { 
       [DataMember(Name = "lat", Order = 1)] 
       public double Lat { get; set; } 
       [DataMember(Name = "lng", Order = 2)] 
       public double Lng { get; set; } 
      } 
     } 
    } 
} 

나는 다음과 같은 방법

DataContractSerializer serializer = new DataContractSerializer(typeof(GeocodeResponse)); 

var response = (GeocodeResponse)serializer.ReadObject(request.GetResponse().GetResponseStream()); 
를 사용하여 직렬화하려고

deserialization 후 Results는 항상 비어 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

업데이트 :

변경된 결과 요소. 다른 오류 지금 가져 오기 :

GeocodeResponse 유형의 객체를 비 직렬화하는 동안 오류가 발생했습니다. 루트 수준의 데이터가 유효하지 않습니다. 1 호선, 위치 1.

... 

    [DataMember(Name = "result", Order = 2)] 
    public CResult Result { get; set; } 

    [DataContract] 
    public class CResult 
    { 
    ... 

나는 아래와 같은 JSON을 사용하여 원래 객체를 직렬화 할 수 있어요. 그 안에 모든 것을 하나만 <result> 태그가있는 경우

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(GeocodeResponse)); 

답변

2

DataContractSerializer (DCS)을 사용하여 해당 요청의 응답을 deserialize 할 수 없으므로 XmlSerializer을 사용해야합니다. DCS는 아래에 표시된 것과 같이 응답에 포함 된 unwrapped 모음을 지원하지 않습니다. 그들은 자신의 요소에 싸여있을 때

<a> 
    <b/> 
    <c/> 
    <c/> 
    <c/> 
</a> 

DCS는 컬렉션을 지원

<a> 
    <b/> 
    <cs> 
    <c/> 
    <c/> 
    <c/> 
    </cs> 
</a> 

XmlSerializer는 컬렉션을 지원하지 않습니다. 아래 코드는 Google 지오 코딩 XML의 응답을 비 직렬화하는 부분 클래스 구조를 보여줍니다.

public class StackOverflow_7521821 
{ 
    [XmlRoot(ElementName = "GeocodeResponse", Namespace = "")] 
    public class GeocodeResponse 
    { 
     [XmlElement(ElementName = "status")] 
     public GeocodeResponseStatusCode Status; 
     [XmlElement(ElementName = "result")] 
     public List<GeocodeResponseResult> Results; 
    } 
    [XmlType(Namespace = "")] 
    public class GeocodeResponseResult 
    { 
     [XmlElement(ElementName = "type")] 
     public List<string> Types; 
     [XmlElement(ElementName = "formatted_address")] 
     public string FormattedAddress; 
     [XmlElement(ElementName = "address_component")] 
     public List<GeocodeResponseAddressComponent> AddressComponents; 
     [XmlElement(ElementName = "geometry")] 
     public GeocodeResponseResultGeometry Geometry; 
    } 
    [XmlType(Namespace = "")] 
    public class GeocodeResponseAddressComponent 
    { 
     [XmlElement(ElementName = "long_name")] 
     public string LongName; 
     [XmlElement(ElementName = "short_name")] 
     public string ShortName; 
     [XmlElement(ElementName = "type")] 
     public List<string> Types; 
    } 
    [XmlType(Namespace = "")] 
    public class GeocodeResponseResultGeometry 
    { 
     [XmlElement(ElementName = "location")] 
     public Location Location; 
     [XmlElement(ElementName = "location_type")] 
     public GeocodeResponseResultGeometryLocationType LocationType; 
     [XmlElement(ElementName = "viewport")] 
     public GeocodeResponseResultGeometryViewport Viewport; 
    } 
    [XmlType(Namespace = "")] 
    public class GeocodeResponseResultGeometryViewport 
    { 
     [XmlElement(ElementName = "southwest")] 
     public Location Southwest; 
     [XmlElement(ElementName = "northeast")] 
     public Location Northeast; 
    } 
    public enum GeocodeResponseStatusCode 
    { 
     OK, 
     ZERO_RESULTS, 
     OVER_QUERY_LIMIT, 
     REQUEST_DENIED, 
     INVALID_REQUEST, 
    } 
    public enum GeocodeResponseResultGeometryLocationType 
    { 
     ROOFTOP, 
     RANGE_INTERPOLATED, 
     GEOMETRIC_CENTER, 
     APPROXIMATE, 
    } 
    [XmlType(Namespace = "")] 
    public class Location 
    { 
     [XmlElement(ElementName = "lat")] 
     public string Lat; 
     [XmlElement(ElementName = "lng")] 
     public string Lng; 
    } 
    public static void Test() 
    { 
     XmlSerializer xs = new XmlSerializer(typeof(GeocodeResponse)); 
     WebClient c = new WebClient(); 
     byte[] response = c.DownloadData("http://maps.googleapis.com/maps/api/geocode/xml?address=1+Microsoft+Way,+Redmond,+WA&sensor=true"); 
     MemoryStream ms = new MemoryStream(response); 
     GeocodeResponse geocodeResponse = (GeocodeResponse)xs.Deserialize(ms); 
     Console.WriteLine(geocodeResponse); 

     c = new WebClient(); 
     response = c.DownloadData("http://maps.googleapis.com/maps/api/geocode/xml?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true"); 
     ms = new MemoryStream(response); 
     geocodeResponse = (GeocodeResponse)xs.Deserialize(ms); 
     Console.WriteLine(geocodeResponse); 
    } 
} 
+0

감사합니다. – Deepfreezed

0

당신은 List<Result>를 사용하지 않습니다. 내 테스트 코드에서 List을 삭제했으며 Results은 더 이상 비어 있지 않습니다.

+0

변경되었지만 다른 오류가 발생했습니다. – Deepfreezed