2012-08-16 94 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,因此我们可以自由地强行打字,这是我的首选,因为我很懒!