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数据为例,然后 ...
随机推荐
- Constructing Roads In JGShining's Kingdom(HDU 1025 LIS nlogn方法)
Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65 ...
- jquery实现导航栏头部点击变换颜色
实现效果如下: 话不多说直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- un ange frappe a ma porte
Un signe, une larme 魂牵 泪扰 un mot, une arme 字断 情烧 nettoyer les étoiles à l'alcool de mon ame 灵魂之酒眷洗 星 ...
- [TYVJ] P1023 奶牛的锻炼
奶牛的锻炼 背景 Background USACO 描述 Description 奶牛Bessie有N分钟时间跑步,每分钟她可以跑步或者休息.若她在第i分钟跑步,可以跑出D_i米,同时疲倦程度增加 ...
- XJOI网上同步训练DAY1 T2
思路:似曾相识?...见http://www.cnblogs.com/qzqzgfy/p/5266874.html 一看时限还是4s!,于是就开开心心地打了70%的分,就是用容斥原理,就可以n^3解决 ...
- jQuery对象与DOM对象的互相转换
jQuery对象转换成DOM对象jQuery提供了两种方法将一个jQuery对象转换成DOM对象,即[index]和get(index).1.jQuery对象是一个数组对象,可以通过[index]的方 ...
- C++标准:C++不允许修改任何基本型别(包括指针)的暂时值
从<C++标准库>一书中看到这样一句话:C++不允许修改任何基本型别(包括指针)的暂时值,想了半天,实在不理解.基本类型char,int,float等等还有暂时值?例如int a=2,那么 ...
- ps查看内存占用排序
ps -eo rss,pmem,pcpu,vsize,args | sort -k 1 -r -n | less 解析一下: ps 都知道,是linux,unix显示进程信息的, -e 是显示所有进程 ...
- hdu 5640 King's Cake(模拟)
Problem Description It is the king's birthday before the military parade . The ministers prepared ...
- java时间格式转换
package org.shineway.com; import java.text.ParseException; import java.text.SimpleDateFormat; import ...