2016-07-21 7 views
1

Ich muss die folgende JSON-Zeichenfolge in DataTable konvertieren.Verschachtelte JSON-Zeichenfolge in 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" 
    } 
} 

In Datatable muss ich

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

zeigen, was ich bis jetzt ist haben,

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(); 

Ich bin nur drei Spalten in Datentabelle

train_num 
train_name 
doj 
+0

warum auf eine Datentabelle überhaupt die Mühe Umwandlung? Sie können Ihr Zugobjekt direkt binden. z.B. Zugdaten = (Train) JsonConvert.DeserializeObject (JsonString); ui_grdVw_EmployeeDetail1.DataSource = Daten; – Delosdos

Antwort

3

Sie bekommen müssen Sie Ihre DataTable-Konvertierung optimieren Methode, um generischer zu sein. Übergeben Sie dann die Daten so, wie Sie es möchten.

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; 
} 

Hinweis: die folgenden Verfahren verwendet werden, können jede Liste auf Datatable zu konvertieren.

Verbrauch:

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); 
+0

hat es funktioniert. Vielen Dank – Soniya

+0

Was ist, wenn es andersherum ist? Wie sollten Sie eine Datentabelle in einen geschachtelten JSON formatieren? –