天地圖地理編碼(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等屬性(UserAgent非常重要,否則服務器認為是非法請求)一定要設置完整。在訪問百度地圖的地理編碼(GeoCoder)服務接口時不設置上述參數也能夠正常訪問。