[事件回顧]
今天在做一個小項目的時候,想獲取一下位置,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() //省份 // }