[事件回顾]
今天在做一个小项目的时候,想获取一下位置,IP地址,然后随便在网上找了一个api调用
https://apis.map.qq.com/ws/location/v1/ip
数据如下:
如果是用Python的话,很简单,请求API-》得到Json-》然后print(["result"]["ip"])就可以了,C#有点麻烦,用了多个方法来解决
前提是先引入 using Newtonsoft.Json.Linq;,或者 using Newtonsoft.Json;
//string ip = "{"status": 311, "message": "key格式错误"}"; // JsonReader reader = new JsonReader(new StringReader(ip)); // JsonReader reader = new JsonReader(); ////ip 表示的json字符串为json对象 第一种 //JObject jsonObj = JObject.Parse(ip); //ip 表示的json字符串为json数组 第二种 JArray jarry = JArray.Parse("[" + ip + "]");
//第三种 //IP bk1 = JsonConvert.DeserializeObject<IP>(ip);
// List<string> videogames = Newtonsoft.Json.JsonConvert.DeserializeObject<lis<string>>(ip); 第四种 // var htmlAttributes = Newtonsoft.Json.JsonConvert.DeserializeObject<IP>(ip); 第五种 // string aaa = htmlAttributes.ip; // var user = (IP)JsonConvert.DeserializeObject(ip, typeof(IP));//反序列化 第六种
以上这些方法,简单Json都可以解析获取到 ,比如这个Json格式://string ip = "{"status": 311,"message": "key格式错误"}";
但是对于这段Json就不能用了
1 { 2 "status": 0, 3 "message": "query ok", 4 "result": { 5 "ip": "27.154.44.20", 6 "location": { 7 "lat": 24.61854, 8 "lng": 118.24722 9 }, 10 "ad_info": { 11 "nation": "中国", 12 "province": "福建省", 13 "city": "厦门市", 14 "district": "翔安区", 15 "adcode": 350213 16 } 17 } 18 }
解决方法
先创建一个IP类:(这个类 可以创建你需要的字段,不需要的字段可以不要,这里我把全部字段都写了出来)
1 public class IP 2 { 3 /// <summary> 4 /// IP地址 5 /// </summary> 6 public string ip; 7 /// <summary> 8 /// 国家 9 /// </summary> 10 public string nation; 11 /// <summary> 12 /// 省份 13 /// </summary> 14 public string province; 15 /// <summary> 16 /// 城市 17 /// </summary> 18 public string city; 19 /// <summary> 20 /// 地区 21 /// </summary> 22 public string district; 23 /// <summary> 24 /// 邮编 25 /// </summary> 26 public string adcode; 27 28 public string status; 29 30 public string message; 31 public string result; 32 33 public string location; 34 35 public string lat; 36 37 public string lng; 38 39 public string ad_info; 40 41 42 }
接着引用
using Newtonsoft.Json.Linq;
使用JArray.Parse(ip );
当然,你这一步直接运行是会报错的,报错的大致意思是,这不是一个数组 我们怎么办呢->答案是 拼接一下,加上一个[ ]
JArray jarry = JArray.Parse("[" + ip + "]");
解析
string a= ["result"]["ip"].ToString();
但是这样子,报错,说是result这里是要传入一个int32类型的数据 ???? 嗯,很奇怪啊 然后我们换一下 : string a= [0]["ip"].ToString();
出现问题了:说是ip 找不到这个字段属性 ??又怎么了 然后下标法 :
string a= [0][1].ToString();
说是索引超过界限
试了几次,发现总是出现类似索引超过界限的问题,最后 自己的看了一下这段json,然后发现问题
{ "status": 0, "message": "query ok", "result": { "ip": "27.154.44.20", "location": { "lat": 24.61854, "lng": 118.24722 }, "ad_info": { "nation": "中国", "province": "福建省", "city": "厦门市", "district": "翔安区", "adcode": 350213 } } } 第一个必须是0,才能进入下一个方法传值 于是我想 第一个是0 ,那是应为他有{} 下面没有,是不是不用写呢? 于是试了一下 string a= jarry[0]["result"]["ip"].ToString(); ip获取出来了
这个难题终于解决了,好了,记录一下
demo
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Reflection; using System.Text; using System.Web; namespace WebAPI5.IP { public class JsonData { public static string code; /自定义错误代码 类型如 :500 服务器错误 200 Success 404 类似错误代码/ public static string message; /自定义错误/ public static long time = ((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000); /* 时间戳*/ /// <summary> /// 封装请求ip方法 Post /// </summary> /// <param name="url"></param> /// <param name="body"></param> /// <returns></returns> public static string HttpPost(string url, string body) { Encoding encoding = Encoding.UTF8; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.Accept = "text/html, application/xhtml+xml, */*"; request.ContentType = "application/json"; byte[] buffer = encoding.GetBytes(body); request.ContentLength = buffer.Length; request.GetRequestStream().Write(buffer, 0, buffer.Length); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } /// <summary> /// 封装请求Ip方法 Get /// </summary> /// <param name="url"></param> /// <returns></returns> public static string HttpGet(string url) { Encoding encoding = Encoding.UTF8; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.Accept = "text/html, application/xhtml+xml, */*"; request.ContentType = "application/json"; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8)) { return reader.ReadToEnd(); } } /// <summary> /// ip请求地址 /// </summary> /// <returns></returns> public static string GetIp() { return HttpGet("https://apis.map.qq.com/ws/location/v1/ip?key=你的key"); } } ///不需要的字段可以不用写 public class IP { /// <summary> /// IP地址 /// </summary> public string ip; /// <summary> /// 国家 /// </summary> public string nation; /// <summary> /// 省份 /// </summary> public string province; /// <summary> /// 城市 /// </summary> public string city; /// <summary> /// 地区 /// </summary> public string district; /// <summary> /// 邮编 /// </summary> public string adcode; public string status; public string message; public string result; public string location; public string lat; public string lng; public string ad_info; } } 调用: //string ip = JsonData.GetIp(); //JArray jarry = JArray.Parse("[" + ip + "]"); //SYS_LoginInfo loginInfo; // loginInfo = new SYS_LoginInfo // { // SYS_LoginTime = Convert.ToInt32(JsonData.time), //登陆时间 // SYS_IP = jarry[0]["result"]["ip"].ToString(), //ip // SYS_city = jarry[0]["result"]["ad_info"]["city"].ToString(), // 城市 // SYS_district = jarry[0]["result"]["ad_info"]["district"].ToString(), //地区 // SYS_nation = jarry[0]["result"]["ad_info"]["nation"].ToString(), // 国家 // SYS_province = jarry[0]["result"]["ad_info"]["province"].ToString() //省份 // }