[事件回顾]

今天在做一个小项目的时候,想获取一下位置,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就不能用了
 {
"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
}
}
}

解决方法

先创建一个IP类:(这个类 可以创建你需要的字段,不需要的字段可以不要,这里我把全部字段都写了出来)

  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; }

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": ,
"message": "query ok",
"result": {
"ip": "27.154.44.20",
"location": {
"lat": 24.61854,
"lng": 118.24722
},
"ad_info": {
"nation": "中国",
"province": "福建省",
"city": "厦门市",
"district": "翔安区",
"adcode":
}
}
} 第一个必须是0,才能进入下一个方法传值
于是我想 第一个是0 ,那是应为他有{}
下面没有,是不是不用写呢?
于是试了一下
string a= jarry[]["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; /自定义错误代码 类型如 : 服务器错误 Success 类似错误代码/
public static string message; /自定义错误/
public static long time = ((DateTime.Now.ToUniversalTime().Ticks - ) / ); /* 时间戳*/ /// <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, , 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() //省份
// }

C#解析多层Json数据的更多相关文章

  1. JAVA如何解析多层json数据

    1. 使用标准的Json对象,如org.json.JSONObject json = new org.json.JSONObject(yourJsonString);然后通过get(keyString ...

  2. Gson解析复杂Json数据

    背景                                                                   json是一种数据格式,便于数据传输.存储.交换. gson是 ...

  3. 解析天气预报JSON数据

    解析天气预报JSON数据 JSON字符串 constjson2 = '{' + #13#10 +'"error":0,' + #13#10 +'"status" ...

  4. mormot解析天气预报JSON数据

    mormot解析天气预报JSON数据 uses SynCommons; constjson2 = '{' + #13#10 +'"error":0,' + #13#10 +'&qu ...

  5. 模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。

    需要用到的lib包 :解析json  gson包,从网络地址解析json数据成String字符串的异步网络解析工具AsyncHttpClient等 下载地址:点击下载 Xlistview 下拉上拉第三 ...

  6. 解析网络json数据,模拟美团界面显示。

    <?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android=&q ...

  7. Android网络请求与数据解析,使用Gson和GsonFormat解析复杂Json数据

    版权声明:未经博主允许不得转载 一:简介 [达叔有道]软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family ...

  8. C# JToken类的使用,实现解析动态json数据、遍历、查找

    在原来解析json数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的json数据,这种方法就不使用. 为了解决动态解析js ...

  9. java android使用Gson解析泛型json数据

    那就直接开始吧. 在我们获取服务器返回的json数据有时候会出现这种情况,比如: {"body":{"attrName":"feed",&q ...

随机推荐

  1. Java以UTF-8格式读写及追加写文件示例

    package test; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; im ...

  2. linux 大量time_wait的解决方法

    通过调整内核参数解决vi /etc/sysctl.conf 编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ip ...

  3. 用MATLAB的Classficiation Learner工具箱对12个数据集进行各种分类与验证

    准备材料 以所有的特征集作为variable进行像Bayes吖.SVM吖.决策树吖......分类.同时对数据进行预处理,选出相关度高的特征子集作为新的一组data进行分类(预处理的代码不必放出来). ...

  4. centos7.6 升级openssh openssl

    centos7.3和centos7.6升级完毕测试登录ssh以及重启后登录ssh均无问题. 前期请自行配置好yum源(如果不会请百度) 整个过程不需要卸载原先的openssl包和openssh的rpm ...

  5. 常见问题:计算机网络/运输层/UDP

    几乎不对IP增加其他东西,无连接. 优势 速度快.适合实时. 无连接建立,没有连接时延. 无连接状态. 分组首部开销小.TCP需20字节,UDP仅需8字节. 使用UDP的协议 DNS SNMP RIP ...

  6. 关于tornado的raise gen.Retuen()

    raise gen.Return(response.body)在python3.3以后作用相当于return, 在python3.3之前作用是返回一个异常值, 和返回一个value python 3. ...

  7. 查看cpu核的相关信息

    查看CPU信息(型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 80 Intel(R) Xeon(R) CPU E7-4820 v3 ...

  8. UMl类图基本认识

    1.基本认识 1) UML——Unified modeling language UML (统一建模语言), 是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果2) ...

  9. 使用Wifi pineapple(菠萝派)进行Wi-Fi钓鱼攻击

    简介: WiFi Pineapple 是由国外无线安全审计公司Hak5开发并售卖的一款无线安全测试神器. 特性: 用作 Wi-Fi 中间人攻击测试平台 一整套的针对 AP 的渗透测试套件 基于 WEB ...

  10. HTTP权威指南-概述

    URI 统一资源标识符 类似于邮件地址,邮箱. URL 统一资源定位符 URN 统一资源名 HTTP方法 get post put delete post head 状态码 200 OK 302 重定 ...