C#解析JSON数据
本篇文章主要介绍C#对Json数据的读取。
主要操作过程是:
- 发送Http请求获取Json数据
- 把获取的Json数据转换成C#中的类
下面我们以12306火车票余票的数据为例进行切入。
首先来看一下http请求和获取到Json数据的格式:
服务器端返回的余票信息:
"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数据进行访问了。