zoukankan      html  css  js  c++  java
  • 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()  //省份
            //    }
     
  • 相关阅读:
    【个人】排序练习
    lintcode:二叉树的层次遍历
    lintcode:子集 & 带重复元素的子集
    lintcode:全排列&带重复元素的排列
    5.2哈夫曼树——哈夫曼树与哈夫曼编码
    5.1 堆 —— 堆的定义与操作
    04-树7 二叉搜索树的操作集
    04-树6 Complete Binary Search Tree
    04-树5 Root of AVL Tree
    04-树4 是否同一棵二叉搜索树
  • 原文地址:https://www.cnblogs.com/whatarey/p/11107861.html
Copyright © 2011-2022 走看看