2012-08-16 98 views
27

我JSON的格式如下:轉換JSON到數據表

[ 
    {"id":"10","name":"User","add":false,"edit":true,"authorize":true,"view":true}, 
    {"id":"11","name":"Group","add":true,"edit":false,"authorize":false,"view":true}, 
    {"id":"12","name":"Permission","add":true,"edit":true,"authorize":true,"view":true} 
] 

我如何可以轉換成C#DataTable對象,如下所示?

--------------------------------------------------------------------- 
ID | Name  | Add | Edit | View | Authorize 
--------------------------------------------------------------------- 
10 | User  | true | true | true | true 
11 | Group  | true | true | true | true 
12 | Permission| true | true | true | true 
+0

請將[本] [1]問題的答案作爲參考。 [1]:http://stackoverflow.com/questions/2246694/how-to-convert-json-object-to-custom-c-sharp-object – 2012-08-16 06:04:35

+1

可能[如何轉換JSON的副本到datatable?](http://stackoverflow.com/questions/7641004/how-to-convert-json-into-datatable) – wildcat 2015-07-23 09:18:20

回答

31

反序列化jsonstring一些類

List<User> UserList = JsonConvert.DeserializeObject<List<User>>(jsonString);

寫入以下extension method到項目

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

調用擴展方法像

UserList.ToDataTable<User>();

+1

什麼是JsonConvert?我需要包含任何名稱空間嗎?它得到錯誤 – Nithesh 2012-08-16 07:16:52

+0

是的...你需要參考DLL [從這裏](http://json.codeplex.com/) – 2012-08-16 07:19:15

+0

我想使用上面的擴展方法 - 構建無錯誤。但是我收到編譯錯誤:「編譯器錯誤消息:CS0121:以下方法或屬性之間的調用不明確:'ExtensionHelpers.ToDataTable <_Default.Jobs>(System.Collections.Generic.IList <_Default.Jobs>)'和'ExtensionHelpers.ToDataTable <_Default.Jobs>(System.Collections.Generic.IList <_Default.Jobs>)'「你有什麼想法可能導致它? @PravinPawar – 2015-06-18 07:20:11

1

您可以在這裏使用JSON.Net這裏。看看JsonConvert.DeserializeObject的方法。

-1

我建議您使用JSON.NET。它是一個開源的庫序列化和反序列化的C#對象轉換成JSON和JSON對象到.NET對象......

序列化實例:

Product product = new Product(); 
product.Name = "Apple"; 
product.Expiry = new DateTime(2008, 12, 28); 
product.Price = 3.99M; 
product.Sizes = new string[] { "Small", "Medium", "Large" }; 

string json = JsonConvert.SerializeObject(product); 
//{ 
// "Name": "Apple", 
// "Expiry": new Date(1230422400000), 
// "Price": 3.99, 
// "Sizes": [ 
// "Small", 
// "Medium", 
// "Large" 
// ] 
//} 

Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json); 
+0

我們如何做到這一點名單? – Jesuraja 2014-06-04 09:43:53

+1

這是爲什麼downvoted? JSON.NET是一個可行的選項 – 2017-08-02 03:32:17

37

有比這裏其他的答案,這需要先反序列化到C#類,然後把它變成一個DataTable更簡單的方法。

它可以直接進入一個DataTable,與JSON.NET和這樣的代碼:

DataTable dt = (DataTable)JsonConvert.DeserializeObject(json, (typeof(DataTable))); 
+1

當嘗試序列化Json對象時,這會引發JsonSerializationException – Guerrilla 2015-05-09 16:19:14

+0

@Guerrilla異常中的消息是什麼?你有沒有檢查過JSON格式正確? – Kyle 2015-05-11 17:01:04

+0

這是我的錯,我不得不將對象添加到數組中,然後它工作正常。 – Guerrilla 2015-05-11 17:10:01

14

它也可以使用下面的代碼來實現。

DataSet data = JsonConvert.DeserializeObject<DataSet>(json); 
+1

其簡單方便 – abhi 2016-01-21 06:56:32

2

一個並不總是知道反序列化的類型。因此,能夠接受任何JSON(包含一些數組)並從中動態生成表格會很方便。

然而,一個問題可能會出現,其中反序列化器不知道在哪裏尋找要製表的數組。發生這種情況時,我們收到與以下類似的錯誤消息:

讀取DataTable時發生意外的JSON令牌。預期StartArray,得到StartObject。路徑「」,1號線,位置1

即使我們給它來鼓勵或陣列內相應的準備我們的JSON,然後選擇「對象」類型還能預防制表的發生,在解串器不讀取數據表時

意外的JSON令牌:知道如何代表行等方面的目標。在這種情況下,類似於下面的錯誤發生在StartObject。路徑'[0] .__元數據',第3行,位置19.

下面的示例JSON包含這兩個有問題的功能......:

{ 
    "results": 
    [ 
    { 
     "Enabled": true, 
     "Id": 106, 
     "Name": "item 1", 
    }, 
    { 
     "Enabled": false, 
     "Id": 107, 
     "Name": "item 2", 
     "__metadata": { "Id": 4013 } 
    } 
    ] 
} 

那麼我們如何解決這個問題,仍然保持不知道衍生類型的靈活性?

那麼這裏是一個簡單的方法,我想出了(假設你是快樂忽略對象類型的屬性,如上面的例子__metadata):

using Newtonsoft.Json; 
using Newtonsoft.Json.Linq; 
using System.Data; 
using System.Linq; 
... 

public static DataTable Tabulate(string json) 
{ 
    var jsonLinq = JObject.Parse(json); 

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

我知道這可能是更Linq y並且絕對有0個異常處理,但希望傳達這個概念。 我的工作開始在我的工作中使用越來越多的服務,這些服務吐出JSON,因此我們可以自由地強行打字,這是我的首選,因爲我很懶!