在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)服务接口时不设置上述参数也能够正常访问。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理