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获取出来了

这个难题终于解决了,好了,记录一下

猜你喜欢

转载自www.cnblogs.com/whatarey/p/11107861.html