C# 数据表的嵌套Json字符串

C# 数据表的嵌套Json字符串,c#,json,datatable,json.net,C#,Json,Datatable,Json.net,我需要将以下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",

我需要将以下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<Train>(JsonString);
    dt = ToDataTable(data);
    ui_grdVw_EmployeeDetail1.DataSource = dt;
    ui_grdVw_EmployeeDetail1.DataBind();

您需要调整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;
}
公共静态数据表到数据表(IList数据)
{
PropertyDescriptorCollection道具=
GetProperties(typeof(T));
DataTable=新的DataTable();
for(int i=0;i
注意:以下方法可用于将任何列表转换为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"
   }
}
用法:

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);
var data=JsonConvert.DeserializeObject(JsonString);
var shapedData=Enumerable.Range(0,1)。选择(x=>
刚出现的
{
列车编号=data.train\u num,
列车名称=data.train\u name,
doj=data.doj,
from_station=data.from_station.name,
to_station=data.to_station.name
}).ToList();
DataTable dt=ToDataTable(shapedData);

您需要调整数据表转换方法,使其更通用。然后将数据按您希望的形状传递给它

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;
}
公共静态数据表到数据表(IList数据)
{
PropertyDescriptorCollection道具=
GetProperties(typeof(T));
DataTable=新的DataTable();
for(int i=0;i
注意:以下方法可用于将任何列表转换为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"
   }
}
用法:

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);
var data=JsonConvert.DeserializeObject(JsonString);
var shapedData=Enumerable.Range(0,1)。选择(x=>
刚出现的
{
列车编号=data.train\u num,
列车名称=data.train\u 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());
    }
公共数据表jsonToDataTable(字符串jsonString) { var jsonLinq=JObject.Parse(jsonString); //使用Linq查找第一个数组 var srcArray=jsonLinq.subjects(),其中(d=>d是JArray.First(); var trgArray=new JArray(); foreach(srcArray.Children()中的JObject行) { var cleanRow=new JObject(); foreach(row.property()中的JProperty列) { //仅包括JValue类型 if(column.Value为JValue) { 添加(column.Name、column.Value); } } trgaray.Add(cleanRow); } 返回JsonConvert.DeserializeObject(trgaray.ToString()); }
试试这段代码

    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());
    }
公共数据表jsonToDataTable(字符串jsonString) { var jsonLinq=JObject.Parse(jsonString); //使用Linq查找第一个数组 var srcArray=jsonLinq.subjects(),其中(d=>d是JArray.First(); var trgArray=new JArray(); foreach(srcArray.Children()中的JObject行) { var cleanRow=new JObject(); foreach(row.property()中的JProperty列) { //仅包括JValue类型 if(column.Value为JValue) { 添加(column.Name、column.Value); } } trgaray.Add(cleanRow); } 返回JsonConvert.DeserializeObject(trgaray.ToString()); }
为什么要费心转换成数据表呢?可以直接绑定train对象。e、 g.列车数据=(列车)JsonConvert.DeserializeObject(JsonString);ui_grdVw_EmployeeDetail1.DataSource=数据;为什么要费心转换成数据表呢?可以直接绑定train对象。e、 g.列车数据=(列车)JsonConvert.DeserializeObject(JsonString);ui_grdVw_EmployeeDetail1.DataSource=数据;如果是另一种情况呢?如何将数据表格式化为嵌套的JSON?如果反过来呢?如何将数据表格式化为嵌套的JSON?