C#解析多层Json数据
Posted whatarey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
接着引用
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获取出来了
这个难题终于解决了,好了,记录一下
以上是关于C#解析多层Json数据的主要内容,如果未能解决你的问题,请参考以下文章