Converter JSON para DataTable

Eu tenho JSON no seguinte formato:

[ {"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} ] 

Como posso converter isso em um object C # DataTable seguinte maneira?

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

Desserialize seu jsonstring para alguma class

 List UserList = JsonConvert.DeserializeObject>(jsonString); 

Escreva o seguinte método de extensão para seu projeto

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

Chame o método de extensão como

 UserList.ToDataTable(); 

Há um método mais fácil do que as outras respostas aqui, que requerem primeiro desserializar em uma class #ac e, em seguida, transformá-la em uma tabela de dados.

É possível ir diretamente para uma tabela de dados, com JSON.NET e código como este:

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

Também pode ser alcançado usando o código abaixo.

 DataSet data = JsonConvert.DeserializeObject(json); 

Nem sempre se sabe o tipo para desserializar. Portanto, seria útil poder usar qualquer JSON (que contenha algum array) e produzir dinamicamente uma tabela a partir disso.

Um problema pode surgir no entanto, onde o desserializador não sabe onde procurar o array para tabular. Quando isso acontece, recebemos uma mensagem de erro semelhante à seguinte:

Token JSON inesperado ao ler DataTable. StartArray esperado, tem StartObject. Caminho ”, linha 1, posição 1.

Mesmo se dermos incentivo ou prepararmos o nosso json de acordo, então os tipos de “object” dentro do array ainda podem impedir a tabulação, onde o desserializador não sabe como representar os objects em termos de linhas, etc. , erros semelhantes ao seguinte ocorrem:

Token JSON inesperado ao ler DataTable: StartObject. Caminho ‘[0] .__ metadados’, linha 3, posição 19.

O exemplo abaixo JSON inclui esses dois resources problemáticos:

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

Então, como podemos resolver isso, e ainda manter a flexibilidade de não saber o tipo para desclassificar?

Bem, aqui está uma abordagem simples que eu criei (supondo que você esteja feliz em ignorar as propriedades do tipo de object, como __metadata no exemplo acima):

 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()) { 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(trgArray.ToString()); } 

Eu sei que isso poderia ser mais “LINQy” e tem absolutamente zero exception handling, mas espero que o conceito seja transmitido.

Estamos começando a usar mais e mais serviços no meu trabalho que remetem o JSON, então nos libertarmos de digitar tudo com muita força, é minha preferência óbvia porque sou preguiçoso!

Você pode fazer uso do JSON.Net aqui. Dê uma olhada no método JsonConvert.DeserializeObject .

Eu recomendo que você use o JSON.NET . é uma biblioteca de código aberto para serializar e desserializar seus objects c # em objects json e Json em objects .net …

Exemplo de serialização:

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

Aqui está outra abordagem perfeita para converter JSON em Datatable usando o Cinchoo ETL – uma biblioteca de código aberto

A amostra abaixo mostra como converter

 string 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} ]"; using (var r = ChoJSONReader.LoadText(json)) { var dt = r.AsDataTable(); } 

Espero que ajude.