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