[英]Nested Json String to 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"
}
}
在數據表中,我需要顯示
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<Train>(JsonString);
dt = ToDataTable(data);
ui_grdVw_EmployeeDetail1.DataSource = dt;
ui_grdVw_EmployeeDetail1.DataBind();
我在數據表中只得到三列
train_num
train_name
doj
您需要調整DataTable轉換方法以使其更通用。 然后將所需形狀的數據傳遞給它。
public static DataTable ToDataTable<T>( IList<T> 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<Train>(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);
嘗試此代碼。
public DataTable jsonToDataTable(string jsonString)
{
var jsonLinq = JObject.Parse(jsonString);
// Find the first array using Linq
var srcArray = jsonLinq.Descendants().Where(d => d is JArray).First();
var trgArray = new JArray();
foreach (JObject row in srcArray.Children<JObject>())
{
var cleanRow = new JObject();
foreach (JProperty column in row.Properties())
{
// Only include JValue types
if (column.Value is JValue)
{
cleanRow.Add(column.Name, column.Value);
}
}
trgArray.Add(cleanRow);
}
return JsonConvert.DeserializeObject<DataTable>(trgArray.ToString());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.