嵌套的Json String到DataTable

我需要将以下Json字符串转换为DataTable。

{ "pnr":"1234567890", "train_num":"12311", "train_name":"HWH DLIKLK MAI", "doj":"23-12-2013", "from_station": { "code":"DLI", "name":"Delhi" }, "to_station": { "code":"KLK", "name":"Kalka" } } 

在DataTable中我需要显示

 train_num train_name doj from_station(name only) to_station(name only) 

我到现在所拥有的是,

 public class Train { public string train_num { get; set; } public string train_name { get; set; } public string doj { get; set; } public from_station from_station { get; set; } public to_station to_station { get; set; } } public class from_station { public string code { get; set; } public string name { get; set; } } public class to_station { public string code { get; set; } public string name { get; set; } } public static DataTable ToDataTable(Train data) { PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(Train)); DataTable table = new DataTable(); for (int i = 0; i < props.Count; i++) { PropertyDescriptor prop = props[i]; table.Columns.Add(prop.Name, prop.PropertyType); } object[] values = new object[props.Count]; for (int i = 0; i < values.Length; i++) { values[i] = props[i].GetValue(data); } table.Rows.Add(values); return table; } var data = JsonConvert.DeserializeObject(JsonString); dt = ToDataTable(data); ui_grdVw_EmployeeDetail1.DataSource = dt; ui_grdVw_EmployeeDetail1.DataBind(); 

我只在数据表中获得三列

 train_num train_name doj 

您需要将DataTable转换方法调整为更通用。 然后传递你想要的数据。

 public static DataTable ToDataTable( IList data) { PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T)); DataTable table = new DataTable(); for (int i = 0; i < props.Count; i++) { PropertyDescriptor prop = props[i]; table.Columns.Add(prop.Name, prop.PropertyType); } object[] values = new object[props.Count]; foreach (T item in data) { for (int i = 0; i < values.Length; i++) { values[i] = props[i].GetValue(item); } table.Rows.Add(values); } return table; } 

注意:以下方法可用于将任何List转换为DataTable。

用法:

 var data = JsonConvert.DeserializeObject(JsonString); var shapedData = Enumerable.Range(0, 1).Select(x => new { train_num = data.train_num, train_name = data.train_name, doj = data.doj, from_station = data.from_station.name, to_station = data.to_station.name }).ToList(); DataTable dt = ToDataTable(shapedData);