2014-12-27 67 views
1

這基本上是我發佈的反序列化JSON到DataTable的前一個問題的後續。那麼該過程也接近尾聲,這是代碼:轉換列表到數據表

  var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
      using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
      { 
       result = streamReader.ReadToEnd(); 
       dynamic d = JObject.Parse(result); 
      } 


      var root = JsonConvert.DeserializeObject<RootObject>(result); 




public static DataTable ToDataTable<T>(this 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; 
    } 


    public class Record 
    { 
     public int StatusID { get; set; } 
     public string Identifier { get; set; } 
     public string Status { get; set; } 
     public string StatusDate { get; set; } 
     public string WorkedBy { get; set; } 
     public string ContactedOn { get; set; } 
     public string Email { get; set; } 
    } 

    public class RootObject 
    { 
     public List<Record> Record { get; set; } 


    } 

現在,反序列化可以正常使用,但我不能轉換爲數據表。我現在用的是ToDataTable延長我在SO發現,這個片段應該把我的列表轉換成一個DataTable:

RootObject.Record.ToDataTable<Record>(); 

現在當然我不能這樣做,因爲記錄不是一個靜態成員,但如果我使靜態的,就像這樣:

public static List<Record> record { get; set; } 

和ToDataTable分機呼叫切換到

RootObject.record.ToDataTable<Record>(); 

它打破了從JSON轉換到列表。如果我使用斷點來驗證「root」var是否爲null並且沒有數據,那麼當它試圖將它變成一個DataTable時,整個事件就會崩潰,因爲它只有空值。

+0

_「現在當然我不能這樣做」_似乎應該有效。你是否收到語法錯誤? – 2014-12-27 15:43:38

+0

是的,我願意。如果我在沒有靜態的情況下調用它,我會得到這樣的結果:'非靜態字段,方法或屬性需要一個對象引用' – 2014-12-27 15:49:24

+2

看起來像'root.Record.ToDataTable();',假設'root'是'RootObject'的一個實例。 – 2014-12-27 15:55:05

回答

3

RootObject包含Record屬性,因此,你需要用它來創建DataTable這樣的:

var root = JsonConvert.DeserializeObject<RootObject>(result); 
root.Record.ToDataTable<Record>(); 

你已經嘗試過什麼是訪問它作爲RootObject類,這是在這個靜態memeber上下文錯誤,因爲反序列化已經創建了RootObject的實例。您現在只需使用要轉換爲DataTableRecord屬性。


這就是爲什麼我認爲這不是一件好事,使用var關鍵字。有時你會忘記或監督它是什麼類型。如果您寫道:

RootObject root = JsonConvert.DeserializeObject<RootObject>(result); 

您可能已經自己找到了解決方案。

+0

哦!我明白了,非常感謝,似乎工作(至少該程序沒有在我的臉上現在吹) – 2014-12-27 15:58:32

+0

感謝您的整個解釋,傾斜的東西好。肯定會像這樣應用它,謝謝一百萬次的工作。 – 2014-12-27 16:00:44