C#解析JSON数据
本篇文章主要介绍C#对Json数据的读取。
主要操作过程是:
- 发送Http请求获取Json数据
- 把获取的Json数据转换成C#中的类
下面我们以12306火车票余票的数据为例进行切入。
首先来看一下http请求和获取到Json数据的格式:
Http RequestGET https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2016-04-01&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT HTTP/1.1
Host: kyfw.12306.cn
服务器端返回的余票信息:
{
"validateMessagesShowId": "_validatorMessage",
"status": true,
"httpstatus": 200,
"data": [
{
"queryLeftNewDTO": {
"train_no": "240000G1010B",
"station_train_code": "G101",
"start_station_telecode": "VNP",
"start_station_name": "北京南",
"end_station_telecode": "AOH",
"end_station_name": "上海虹桥",
"from_station_telecode": "VNP",
"from_station_name": "北京南",
"to_station_telecode": "AOH",
"to_station_name": "上海虹桥",
"start_time": "07:00",
"arrive_time": "12:37",
"day_difference": "0",
"train_class_name": "",
"lishi": "05:37",
"canWebBuy": "Y",
"lishiValue": "337",
"yp_info": "O055300106M0933000689174800011",
"control_train_day": "20301231",
"start_train_date": "20160401",
"seat_feature": "O3M393",
"yp_ex": "O0M090",
"train_seat_feature": "3",
"seat_types": "OM9",
"location_code": "P2",
"from_station_no": "01",
"to_station_no": "10",
"control_day": 59,
"sale_time": "1230",
"is_support_card": "1",
"controlled_train_flag": "0",
"controlled_train_message": "正常车次,不受控",
"gg_num": "--",
"gr_num": "--",
"qt_num": "--",
"rw_num": "--",
"rz_num": "--",
"tz_num": "--",
"wz_num": "--",
"yb_num": "--",
"yw_num": "--",
"yz_num": "--",
"ze_num": "有",
"zy_num": "有",
"swz_num": "11"
},
"secretStr": "MjAxNi0wNC0wMSMwMCNHMTAxIzA1OjM3IzA3OjAwIzI0MDAwMEcxMDEwQiNWTlAjQU9IIzEyOjM3I%2BWMl%2BS6rOWNlyPkuIrmtbfombnmoaUjMDEjMTAjTzA1NTMwMDEwNk0wOTMzMDAwNjg5MTc0ODAwMDExI1AyIzE0NTkwNjc3NDQzOTUjMTQ1NDM4NzQwMDAwMCMzMDFGQTJDNzg1OTI4OTlGNjEzRDg2NEQwRkMwNzlFMzFBQTFCQ0Q1RjNDNTgyNENGMjVCOTQ2QQ%3D%3D",
"buttonTextInfo": "预订"
},
...
"messages": [ ],
"validateMessages": { }
}
添加引用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; // 引用Json序列化命名空间之前需要在项目引用之中添加System.Runtime.Serialization的引用
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.ComponentModel;
using System.Net;
定义Class:
[DataContract]
public class LeftTicketQueryResult
{
[DataMember]
public List<LeftTicketsInfo> data { get; set; } [DataMember]
public string httpstatus { get; set; } [DataMember]
public string status { get; set; }
} [DataContract]
public class LeftTicketsInfo
{
[DataMember]
public string buttonTextInfo { get; set; } [DataMember]
public LeftTicketDetails queryLeftNewDTO {get;set;}
} [DataContract]
public class LeftTicketDetails
{
[DataMember]
public string arrive_time { get; set; } [DataMember]
public string start_time { get; set; } [DataMember]
public string to_station_name { get; set; } [DataMember]
public string from_station_name { get; set; } [DataMember]
public string lishi { get; set; } [DataMember]
public string station_train_code { get; set; } [DataMember]
public string start_train_date { get; set; } [DataMember]
public string day_difference { get; set; } [DataMember]
public string gg_num { get; set; } [DataMember]
public string gr_num { get; set; } [DataMember]
public string qt_num { get; set; } [DataMember]
public string rw_num { get; set; } [DataMember]
public string rz_num { get; set; } [DataMember]
public string swz_num { get; set; } [DataMember]
public string tz_num { get; set; } [DataMember]
public string wz_num { get; set; } [DataMember]
public string yb_num { get; set; } [DataMember]
public string yw_num { get; set; } [DataMember]
public string yz_num { get; set; } [DataMember]
public string ze_num { get; set; } [DataMember]
public string zy_num { get; set; }
}
类定义
执行代码:
{
class Program
{
static void Main(string[] args)
{
try
{
/// Turn off SSL certificate validation
ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(delegate { return true; });
HttpWebRequest request = WebRequest.CreateHttp("https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2016-04-01&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT");
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
DataContractJsonSerializer jsonSerializer = new DataContractJsonSerializer(typeof(LeftTicketQueryResult));
LeftTicketQueryResult leftTicketResult = (LeftTicketQueryResult)jsonSerializer.ReadObject(response.GetResponseStream());
Console.WriteLine("Press any key to exit...");
Console.Read();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.Read();
}
}
}
结果:


然后我们就可以像操作类的属性一样对获取的JSON数据进行访问了。
C#解析JSON数据的更多相关文章
- 使用Python解析JSON数据的基本方法
这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下: ----------------------------------- ...
- 使用jQuery解析JSON数据
我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...
- JSONKit解析json数据
先将第三方文件拖进工程 JSONKit.h和JSONKit.m 然后设置在ARC工程中添加MRC文件,如下图所示 #import "ViewController.h" #impor ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 使用jQuery解析JSON数据(由ajax发送请求到php文件处理数据返回json数据,然后解析json写入html中呈现)
在上一篇的Struts2之ajax初析中,我们得到了comments对象的JSON数据,在本篇中,我们将使用jQuery进行数据解析. 我们先以解析上例中的comments对象的JSON数据为例,然后 ...
随机推荐
- IE attachEvent事件处理程序(事件绑定的函数)的this指向的是window不是执行当前事件的dom元素
IE attachEvent事件处理程序(事件绑定的函数)的this指向的是window不是执行当前事件的dom元素. attachEvent(type,listener); listener函数中的 ...
- Android App 沉浸式状态栏解决方案
伴随着 Android 5.0 发布的 Material Design,让 Android 应用告别了以前的工程师审美,迎来了全新的界面,灵动的交互,也让越来越多的 App 开始遵从 material ...
- python安装包问题小结
你可能遇到的问题包括:ImportError: No module named sklearn 未安装sklearn包ImportError: DLL load failed: 找不到指定的模块Imp ...
- Labeling Balls--poj3687
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12273 Accepted: 3516 D ...
- C 中va_list,va_arg,va_start,va_end usage
1.在学习c语言,难免会遇到多参函数,刚好c中也提供了一些机制:宏函数 #ifdef _M_ALPHA typedef struct { char *a0; /* pointer to first h ...
- python描述符 descriptor
descriptor 在python中,如果一个新式类定义了__get__, __set__, __delete__方法中的一个或者多个,那么称之为descriptor.descriptor通常用来改 ...
- Deploy a Sharded Cluster
Start the Config Server Database Instances for example : mongod --configsvr --dbpath <path> - ...
- 【转】Windows与Linux(Ubuntu)双系统时间不一致的解决方法
当在嵌入式Linux里面备份文件时候,在备份的时候,PC(win7)和开发板的时间都是9:30,但是在开发板发现文件创建时间是9:30,然后u盘插在PC(win7)上,发现文件创建时间是1:30,为什 ...
- php 站内搜索 多表 分页
借鉴了:http://blog.chinaunix.net/uid-20787846-id-3488253.html 这篇文章 ,在此基础上增加了分页功能 <?php /* 关键字 */ $ke ...
- Unity调试中心
渐渐在公司接SDK3个月了,一直没有参加项目的游戏功能编写几乎快忘记Unity了, 看到那些前辈编写游戏到发布游戏,总结了下 每一个游戏应该有一个调试中心, 方便策划 测试更好的了解游戏和测试游戏. ...