本篇文章主要介绍C#对Json数据的读取。

主要操作过程是:

  1. 发送Http请求获取Json数据
  2. 把获取的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

Connection: keep-alive
Cache-Control: no-cache
Accept: */*
X-Requested-With: XMLHttpRequest
If-Modified-Since: 0
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36
Referer: https://kyfw.12306.cn/otn/leftTicket/init
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8

服务器端返回的余票信息:

{
  "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; }
}

类定义

执行代码:

namespace ParseJson
{

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数据的更多相关文章

  1. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  2. 使用jQuery解析JSON数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...

  3. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  4. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  5. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  6. fastjson生成和解析json数据,序列化和反序列化数据

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...

  7. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  8. JSONKit解析json数据

    先将第三方文件拖进工程 JSONKit.h和JSONKit.m 然后设置在ARC工程中添加MRC文件,如下图所示 #import "ViewController.h" #impor ...

  9. Android网络之数据解析----使用Google Gson解析Json数据

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  10. 使用jQuery解析JSON数据(由ajax发送请求到php文件处理数据返回json数据,然后解析json写入html中呈现)

    在上一篇的Struts2之ajax初析中,我们得到了comments对象的JSON数据,在本篇中,我们将使用jQuery进行数据解析. 我们先以解析上例中的comments对象的JSON数据为例,然后 ...

随机推荐

  1. Python Tcp Socket

    socket(套接字),传输层通信的端点,由IP和端口号组成(IP,Port),可以通过socket精确地找到服务器上的进程并与之通信 python2.6实现,基于AF_INET(网络套接字) 类型S ...

  2. Scala学习笔记--上界(<:)、视图界定(<%)、上下文界定(T:M)

    上界 下界 视界 object Test{ def main(args:Array[String]):Unit={ def mulBy(factor:Double)=(x:Double)=>fa ...

  3. MongoDB备份数据库&导入数据库

    今天需要对线上的MongoDB中的webpage库进行备份,然后在本地导入备份的库. 1.备份整个MongoDB数据库 mongodump -h dbhost --port 端口 -u 用户名 -p ...

  4. github在eclipse中的配置

    http://www.cnblogs.com/yejiurui/archive/2013/07/29/3223153.html http://blog.csdn.net/shehun1/article ...

  5. HDU 4009 Transfer water

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4009 题意:给出一个村庄(x,y,z).每个村庄可以挖井或者修建水渠从其他村庄得到水.挖井有一个代价, ...

  6. QtCreator调试传入运行参数

    QtCreator是非常不错的IDE,最近在做的Qt命令行应用,因为调试的环境不同等问题,需要在调试的时候为 main() 传入参数.度娘了半天,没找到方法,只能自力更生.后来在“项目-构建和运行-运 ...

  7. 链接一个外部lib库的时候注意事项

    1.注意这个库是Debug版还是Release版,一般windows下,约定是Debug版的库文件名会加个d. 2.注意这个库是x86还是x64版本. 3.注意生成这个lib库的是什么编译器

  8. 转:关于rename命令ubuntu下的用法

    下面是我的遭遇:上午想批量改几个文件的名字,觉得mv在批量方面不够方便,百度到了rename这个命令,原谅我吧,我总是在百度不到结果时才去看google,以后还是少去百度的好国内很多贴子都在说linu ...

  9. Grok 正则捕获

    Grok 正则捕获: \s+(?<request_time>\d+(?:\.\d+)?)\s+ 回顾下: (?:pattern) 匹 配 pattern 但不获取匹配结果,也就是说这是一个 ...

  10. Live555 分析(三):客服端

    live555的客服端流程:建立任务计划对象--建立环境对象--处理用户输入的参数(RTSP地址)--创建RTSPClient实例--发出DESCRIBE--发出SETUP--发出PLAY--进入Lo ...