在C#中通過使用Newtonsoft.Json庫來解析天地圖地理編碼(GeoCoder)服務接口返回的Json格式的數據,以及HttpWebRequest 設置不完全時服務器返回“遠程服務器返回錯誤: (403) 已禁止”解決方法


天地圖地理編碼(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)服務接口時不設置上述參數也能夠正常訪問。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM