C#解析多層Json數據


[事件回顧]

今天在做一個小項目的時候,想獲取一下位置,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     }
IP類

接着引用 


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()  //省份
        //    }
 

 


免責聲明!

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



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