[事件回顾]

今天在做一个小项目的时候,想获取一下位置,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. python 的环境变量

    import sys,os BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(B ...

  2. RabbitMQ官方教程一Hello World(GOLANG语言实现)

    介绍 RabbitMQ是消息中间件:它接受并转发消息. 您可以将其视为邮局系统:将要发送的邮件放在邮箱中时, 可以确保邮递员最终将邮件传递给收件人. 以此类推,RabbitMQ是一个邮箱,一个邮局和一 ...

  3. CF1227D Optimal Subsequences

    思路: 首先对于单个查询(k, p)来说,答案一定是a数组中的前k大数.如果第k大的数字有多个怎么办?取索引最小的若干个.所以我们只需对a数组按照值降序,索引升序排序即可. 多个查询怎么办?离线处理. ...

  4. [OpenCV开发]OpenCV图像编码和解码 imencode和imdecode使用,用于网络传输图片

    在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据. 这个时候,当你的应用程序读到内存里 ...

  5. Appium移动自动化测试-----(一)Appium介绍

    1.特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用. “移动原生应用”是指那些用iOS或者 Android SDK 写的应用 ...

  6. python线程队列Queue-FIFO(35)

    之前的文章中讲解很多关于线程间通信的知识,比如:线程互斥锁lock,线程事件event,线程条件变量condition 等等,这些都是在开发中经常使用的内容,而今天继续给大家讲解一个更重要的知识点 — ...

  7. matlab中执行mex文件时提示GLIBCXX not found

    解决方案参考: http://stackoverflow.com/questions/8421708/glibcxx-not-found-when-compiling-vtk-example-unde ...

  8. 032 Android智能下拉刷新框架-SmartRefreshLayout+RecyclerView的使用

    1.SmartRefreshLayout介绍 SmartRefreshLayout的目标是打造一个强大,稳定,成熟的下拉刷新框架,并集成各种的炫酷.多样.实用.美观的Header和Footer. 正如 ...

  9. ubuntu mysql5.7设置Open Files Limit

    目的:解决Too many open files异常 方式:设置Open Files Limit 环境:(MySQL)Server version: 5.7.27-0ubuntu0.16.04.1 ( ...

  10. 【转】MySQL中EXISTS的用法

    原文链接:https://www.cnblogs.com/qlqwjy/p/8598091.html 比如在Northwind数据库中有一个查询为 SELECT c.CustomerId,Compan ...