在C#中通过使用Newtonsoft.Json库来解析天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,以及HttpWebRequest 设置不完全时服务器返回“远程服务器返回错误:
Posted rainbow70626
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中通过使用Newtonsoft.Json库来解析天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,以及HttpWebRequest 设置不完全时服务器返回“远程服务器返回错误:相关的知识,希望对你有一定的参考价值。
天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,如下所示:
http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"北京市"}&tk=您的tk密钥
返回结果实例:
{ "msg":"ok", "location": { "level":"地名地址", "lon":116.40100299989, "lat":39.90311700025, "keyWord":"北京市" }, "searchVersion":"6.0.0", "status":"0" }
本文简要介绍如何在C#中通过使用Newtonsoft.Json库来解析Json格式的数据。
1、创建主应用程序(控制台或Winform程序均可);
2、引入Newtonsoft.Json.dll。
3、在工程中创建如下的类,添加using Newtonsoft.Json;名称空间的引用:
using System; using System.Collections.Generic; using System.Text; using Newtonsoft.Json; namespace WorldWind { public class LocationTDT { [JsonProperty("level")] public string Level { get; set; } [JsonProperty("lon")] public double Lon { get; set; } [JsonProperty("lat")] public double Lat { get; set; } [JsonProperty("keyWord")] public string KeyWord { get; set; } } class RecordResultTDT { [JsonProperty("msg")] public string Msg { get; set; } [JsonProperty("location")] public LocationTDT Location { get; set; } [JsonProperty("searchVersion")] public string SearchVersion { get; set; } [JsonProperty("status")] public int Status { get; set; } } }
4、构建URL服务连接,发起Http请求,获取响应数据流中的内容,调用JsonConvert.DeserializeObject()方法将字符串反序列化为对象即可,调用的cs文件中需要添加using Newtonsoft.Json;名称空间的引用:
stringm_CurrentSearchUri="http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"北京市"}&tk=您的tk密钥";
// 发送要求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(m_CurrentSearchUri); //下面的代码一定要加上,在天地图网站会发生"远程服务器返回错误: (403) 已禁止。" request.Method = "GET"; request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; request.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); request.UserAgent = "Mozilla/5.0 (Windows NT 5.2; rv:12.0) Gecko/20100101 Firefox/12.0"; // 取得响应 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); StreamReader sr = new StreamReader(response.GetResponseStream()); //得到一个json字符串 string joResultTemp = sr.ReadToEnd().ToString(); //将返回的json数据转为JSON对象 RecordResultTDT joResult = JsonConvert.DeserializeObject<RecordResultTDT>(joResultTemp);//返回天地图的Json对象
5、另外,天地图的请求URL在浏览器直接输入时会返回正确的Json结果,但是在C#应用程序中当HttpWebRequest 设置不完全时服务器返回“远程服务器返回错误: (403) 已禁止”
解决方法:
如上面的步骤4中提到的,HttpWebRequest 的Method、Accept、Headers、UserAgent等参数一定要设置完整。在访问百度地图的地理编码(GeoCoder)服务接口时不设置上述参数也能够正常访问。
以上是关于在C#中通过使用Newtonsoft.Json库来解析天地图地理编码(GeoCoder)服务接口返回的Json格式的数据,以及HttpWebRequest 设置不完全时服务器返回“远程服务器返回错误:的主要内容,如果未能解决你的问题,请参考以下文章
使用 NewtonSoft Json 在 C# 中获取 JSON 的所有子项
C# Newtonsoft JSON:反序列化和跳过对象名称
如何使用 C# 进行条件序列化 - NewtonSoft.Json