zoukankan      html  css  js  c++  java
  • C#解析JSON数据

    本篇文章主要介绍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数据进行访问了。 

  • 相关阅读:
    SQL中一些有用的关键字
    (转)[VirtualBox] 配置 NAT 和 Bridged Network
    (转)SQL养成一个好习惯是一笔财富
    破解专题
    配置VitualBox+CentOS的SSH配置
    Windows 7 更改全半角切换快捷键(Shif+Space)
    SQL Server 系统表
    grub 安装 linux
    (转)informix错误代码小结
    试用Windows Live Writer
  • 原文地址:https://www.cnblogs.com/silverbullet11/p/DotNet_JSON_Serialization.html
Copyright © 2011-2022 走看看