[事件回顾]

今天在做一个小项目的时候,想获取一下位置,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() //省份
// }

最新文章

  1. $ORACLE_HOME变量值末尾多“/”惹的祸
  2. 企业IT管理员IE11升级指南【4】—— IE企业模式介绍
  3. 关于php的一些小知识!
  4. sql 通过表名获取所有列名
  5. 关于JAVA数据储存
  6. [No00004C]软件工程师的创业陷阱:接私活
  7. python实现简单爬虫抓取图片
  8. mysql的事务和select...for update
  9. WebRTC录音(1)-实现通话双向录音
  10. dig out secrets beneath AirSig
  11. SQL Server数据库学习笔记-外键
  12. C++中使用接口
  13. JAVA多线程学习3--线程一些方法
  14. Sublime Text 3 安装及简单配置
  15. hadoop2.2编程:Tool, ToolRunner, GenericOptionsParser, Configuration
  16. .NET基本权限管理框架源代码
  17. js模块化认识1
  18. nginx笔记4-负载均衡带来的问题以及解决办法
  19. REATE A STATIC WEBSITE
  20. Unity接入Steamworks

热门文章

  1. LeetCode_226. Invert Binary Tree
  2. 迅速生成项目-vue-nuxtjs
  3. asp.net Forms身份验证详解
  4. iOS 获取设备的唯一标识
  5. 利用单臂路由实现vlan间路由
  6. HTTP权威指南-URL与资源
  7. .NET Core 配置文件
  8. python基础学习(十四)
  9. xsy 2412【BZOJ4569】【Scoi2016】萌萌哒
  10. oracle加密--wallet