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就不能用了
{
"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数据的更多相关文章
- JAVA如何解析多层json数据
1. 使用标准的Json对象,如org.json.JSONObject json = new org.json.JSONObject(yourJsonString);然后通过get(keyString ...
- Gson解析复杂Json数据
背景 json是一种数据格式,便于数据传输.存储.交换. gson是 ...
- 解析天气预报JSON数据
解析天气预报JSON数据 JSON字符串 constjson2 = '{' + #13#10 +'"error":0,' + #13#10 +'"status" ...
- mormot解析天气预报JSON数据
mormot解析天气预报JSON数据 uses SynCommons; constjson2 = '{' + #13#10 +'"error":0,' + #13#10 +'&qu ...
- 模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。
需要用到的lib包 :解析json gson包,从网络地址解析json数据成String字符串的异步网络解析工具AsyncHttpClient等 下载地址:点击下载 Xlistview 下拉上拉第三 ...
- 解析网络json数据,模拟美团界面显示。
<?xml version="1.0" encoding="UTF-8"?> <RelativeLayout xmlns:android=&q ...
- Android网络请求与数据解析,使用Gson和GsonFormat解析复杂Json数据
版权声明:未经博主允许不得转载 一:简介 [达叔有道]软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family ...
- C# JToken类的使用,实现解析动态json数据、遍历、查找
在原来解析json数据是,一般都是用反序列化来实现json数据的解读,这需要首先知道json数据的结构并且建立相应的类才能反序列化,一旦遇到动态的json数据,这种方法就不使用. 为了解决动态解析js ...
- java android使用Gson解析泛型json数据
那就直接开始吧. 在我们获取服务器返回的json数据有时候会出现这种情况,比如: {"body":{"attrName":"feed",&q ...
随机推荐
- LINUX 安装 VMware-Tools(附常见问题)
mkdir /cdrom #创建光驱挂载目录 mount /dev/cdrom /cdrom # 加载光驱 tar -zxvf /cdro/VMwareTools**********.tar.gz ~ ...
- [转载] HashMap的工作原理-hashcode和equals的区别
目录 前言 为什么需要使用Hashcode,可以从Java集合的常用需求来描述: 更深入的介绍 先来些简单的问题 HashMap的0.75负载因子 总结 我在网上看到的这篇文章,介绍的很不错,但是我看 ...
- react 生命周期图解
参考地址:https://www.cnblogs.com/gdsblog/p/7348375.html
- SPSS 习题-2
1.有关SPSS数据字典的说法,正确的是: AA. SPSS 数据集的数据字典可以复制到其他数据集中B. SPSS数据集的数据字典是不能复制的C. SPSS的数据字典可以通过“复制”和“粘贴”在不同 ...
- MySQL的join on和 where 的执行顺序和区别,以及各种连接说明
目录 1.各种连接的解读说明: 1.1.各种连接的含义和说明 1.1.1 所有连接分类 1.1.2 left join 和 left outer join 区别 1.2.神图参考 1.4.一些参考说明 ...
- ubuntu 安装 svn
sudo apt-get install subversion
- 2019年广东省赛gdccpc回顾
本次比赛状态一般般,热身赛单人挂机爆零让自己慌了一整天. 开题直接抓E题入手,准备交题后关机(辣鸡云桌面),开机后又告诉我要关机,心急连交两发结果都WA了,最后靠队员提醒救了回来.心态还算稳住了.后面 ...
- LeetCode 718. 最长重复子数组(Maximum Length of Repeated Subarray)
718. 最长重复子数组 718. Maximum Length of Repeated Subarray 题目描述 给定一个含有 n 个正整数的数组和一个正整数 s,找出该数组中满足其和 ≥ s 的 ...
- python内置模块介绍(一)
本文主要介绍模块列表如下: os sys re time datetime random shutil subprocess os模块 os.getcwd() ...
- 【已解决】每次打开Excel时会同时打开一个空的Excel表格
每次打开Excel时会同时打开一个空的Excel表格,情况如图. 官方解法如下,本人验证有效: 方法1, 请到以后路径中检查是否存在与空白文件夹同名字的Excel文件,删除它. C:\Users\\A ...