反序列化 XML 休息 WebApi 调用?
Deserialize XML Rest WebApi Call?
我一直在关注一些在线示例,但出于某种原因我无法成功反序列化以下 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<postcode>BD1 1LT</postcode>
<geo>
<lat>53.793063240118215</lat>
<lng>-1.7540318423563699</lng>
<easting>416300.0</easting>
<northing>433000.0</northing>
<geohash>http://geohash.org/gcwf00dz21g1</geohash>
</geo>
<administrative>
<council>
<title>Bradford</title>
<uri>http://statistics.data.gov.uk/id/statistical-geography/E08000032</uri>
<code>E08000032</code>
</council>
<ward>
<title>City</title>
<uri>http://statistics.data.gov.uk/id/statistical-geography/E05001347</uri>
<code>E05001347</code>
</ward>
<constituency>
<title>Bradford West</title>
<uri>http://statistics.data.gov.uk/id/statistical-geography/E14000589</uri>
<code>E14000589</code>
</constituency>
</administrative>
</result>
我试过各种组合:
[DataContract(Name = "result", Namespace = "")]
public class Result
{
[DataMember(Name = "postcode")]
public string Postcode { get; set; }
[DataMember(Name = "geo")]
public Geo Geo { get; set; }
}
[DataContract(Name = "geo")]
public class Geo
{
[DataMember(Name = "lat")]
public string Lat { get; set; }
}
但我只能得到 post 代码,除此之外别无他物。 以上 是我的 工作atm.
以下是我根据一些示例整理的内容:
[Test]
public void TestRestCall()
{
var url = "http://uk-postcodes.com/postcode/";
var urlParameters = "bd11lt.xml";
var client = new HttpClient();
client.BaseAddress = new Uri(url);
// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
// List data response.
HttpResponseMessage response = client.GetAsync(urlParameters).Result; // Blocking call!
if (response.IsSuccessStatusCode)
{
// Parse the response body. Blocking!
var dataObjects = response.Content.ReadAsAsync<Result>().Result;
//Console.WriteLine("{0}", dataObjects.Geo.);
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
}
更新:
地理 属性 为空,这是我所能得到的。
public string Geo
应该是 public Geo Geo
,不是吗?
这 是 一种有序的东西,但您可以根据 Result
的定义解决它。 DataContractSerializer
,除非另有说明,否则期望元素按字母顺序排列,而不是 class 中定义的顺序。但是,您可以使用 DataMember
的 Order
属性 来明确告诉它期望和发出元素的顺序。
正在将您对 Result
的定义更改为
[DataContract(Name = "result", Namespace = "")]
public class Result
{
[DataMember(Name = "postcode", Order = 1)]
public string Postcode { get; set; }
[DataMember(Name = "geo", Order = 2)]
public Geo Geo { get; set; }
}
应该可以解决您的问题。您可以参考 MSDN 以获得更完整的数据契约中排序语义的描述。
根据@LouieBacaj 的回答,您还需要将空命名空间添加到 Geo
class 以正确反序列化嵌套元素:
[DataContract(Name = "geo", Namespace = "")]
public class Geo
{
[DataMember(Name = "lat")]
public string Lat { get; set; }
}
我发现有两个问题。一个与排序有关,另一个与命名空间有关。
您需要指定所有属性和对象的顺序,但您还需要指定它们的命名空间。
[DataContract(Name = "result", Namespace = "")]
public class Result
{
[DataMember(Name = "postcode", Order = 1)]
public string Postcode { get; set; }
[DataMember(Name = "geo", Order = 2)]
public Geo Geo { get; set; }
}
同样,在您的 GEO 对象上,您必须指定两者才能使映射在 HttpClient 上工作。
[DataContract(Name = "geo", Namespace = "")]
public class Geo
{
[DataMember(Name = "lat", Order = 1)]
public string Lat { get; set; }
}
希望对您有所帮助。
我一直在关注一些在线示例,但出于某种原因我无法成功反序列化以下 XML 文档:
<?xml version="1.0" encoding="UTF-8"?>
<result>
<postcode>BD1 1LT</postcode>
<geo>
<lat>53.793063240118215</lat>
<lng>-1.7540318423563699</lng>
<easting>416300.0</easting>
<northing>433000.0</northing>
<geohash>http://geohash.org/gcwf00dz21g1</geohash>
</geo>
<administrative>
<council>
<title>Bradford</title>
<uri>http://statistics.data.gov.uk/id/statistical-geography/E08000032</uri>
<code>E08000032</code>
</council>
<ward>
<title>City</title>
<uri>http://statistics.data.gov.uk/id/statistical-geography/E05001347</uri>
<code>E05001347</code>
</ward>
<constituency>
<title>Bradford West</title>
<uri>http://statistics.data.gov.uk/id/statistical-geography/E14000589</uri>
<code>E14000589</code>
</constituency>
</administrative>
</result>
我试过各种组合:
[DataContract(Name = "result", Namespace = "")]
public class Result
{
[DataMember(Name = "postcode")]
public string Postcode { get; set; }
[DataMember(Name = "geo")]
public Geo Geo { get; set; }
}
[DataContract(Name = "geo")]
public class Geo
{
[DataMember(Name = "lat")]
public string Lat { get; set; }
}
但我只能得到 post 代码,除此之外别无他物。 以上 是我的 工作atm.
以下是我根据一些示例整理的内容:
[Test]
public void TestRestCall()
{
var url = "http://uk-postcodes.com/postcode/";
var urlParameters = "bd11lt.xml";
var client = new HttpClient();
client.BaseAddress = new Uri(url);
// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/xml"));
// List data response.
HttpResponseMessage response = client.GetAsync(urlParameters).Result; // Blocking call!
if (response.IsSuccessStatusCode)
{
// Parse the response body. Blocking!
var dataObjects = response.Content.ReadAsAsync<Result>().Result;
//Console.WriteLine("{0}", dataObjects.Geo.);
}
else
{
Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
}
}
更新:
地理 属性 为空,这是我所能得到的。
public string Geo
应该是 public Geo Geo
,不是吗?
这 是 一种有序的东西,但您可以根据 Result
的定义解决它。 DataContractSerializer
,除非另有说明,否则期望元素按字母顺序排列,而不是 class 中定义的顺序。但是,您可以使用 DataMember
的 Order
属性 来明确告诉它期望和发出元素的顺序。
正在将您对 Result
的定义更改为
[DataContract(Name = "result", Namespace = "")]
public class Result
{
[DataMember(Name = "postcode", Order = 1)]
public string Postcode { get; set; }
[DataMember(Name = "geo", Order = 2)]
public Geo Geo { get; set; }
}
应该可以解决您的问题。您可以参考 MSDN 以获得更完整的数据契约中排序语义的描述。
根据@LouieBacaj 的回答,您还需要将空命名空间添加到 Geo
class 以正确反序列化嵌套元素:
[DataContract(Name = "geo", Namespace = "")]
public class Geo
{
[DataMember(Name = "lat")]
public string Lat { get; set; }
}
我发现有两个问题。一个与排序有关,另一个与命名空间有关。
您需要指定所有属性和对象的顺序,但您还需要指定它们的命名空间。
[DataContract(Name = "result", Namespace = "")]
public class Result
{
[DataMember(Name = "postcode", Order = 1)]
public string Postcode { get; set; }
[DataMember(Name = "geo", Order = 2)]
public Geo Geo { get; set; }
}
同样,在您的 GEO 对象上,您必须指定两者才能使映射在 HttpClient 上工作。
[DataContract(Name = "geo", Namespace = "")]
public class Geo
{
[DataMember(Name = "lat", Order = 1)]
public string Lat { get; set; }
}
希望对您有所帮助。