C# - Convertendo DataTable para JSON (StringBuilder,JavaSerializer e NewtonSoft) |
Neste artigo eu vou mostrar como podemos converter um DataTable para o formato JSON. |
Este é um artigo para iniciantes que mostra como converter um DataTable para o formato JSON, ou seja, serializar um objeto DataTable em um array JSON ou ainda retornar uma string JSON a partir de um DataTable.
Existem basicamente 3 maneiras de realizar esta conversão :
JSON é um
protocolo leve para intercâmbio de dados e está baseado em um
subconjunto da linguagem de programação JavaScript, sendo independente
desta e de qualquer linguagem. JSON lembra XML :
mas é diferente da XML:
Assim,
JSON é menor do que XML, é mais rápido e mais fácil de analisar. |
A seguir vou mostrar como fazer isso na prática.
Recursos usados:
Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.
Criando a solução e dois projetos no VS Community
Abra o VS Community 2015 e clique em New Project;
Selecione a linguagem Other Projects Type -> Blank Solution;
Informe o nome Converte_DataTable_Json e clique no botão OK;
A seguir no menu File clique em Add -> New Project;
Selecione a linguagem Visual C# -> Windows e o template Windows Forms Application;
Informe o nome CSharp_Json e clique em OK;
No formulário form1.cs inclua a partir da ToolBox os seguintes controles:
1 Label - Text=DataTable
1 DataGridView = dgvDados
1 Button - btnDataTable
1 Label - Text=JSON
1 TextBox - txtDados, Multiline=True
3 Buttons - btnJson, btnJavaScriptSerializar, btnNewtonSoft
Disponha os controles conforme o leiaute da figura a seguir:
Criando a classe para obter a tabela do banco de dados SQL Server
Podemos obter um DataTable de diversas maneiras: acessando um banco de dados e gerando o datatable, criando o DataTable via código, etc.
Neste exemplo eu vou obter o DataTable a partir de uma tabela de um banco de dados SQL Server. Vou usar o banco Cadastro.mdf e a tabela Produtos.
Então vamos criar uma classe no projeto chamada AcessoDB e nesta classe definir o método para retornar o DataTable e também os métodos que iram converter o datatable para o formato JSON.
No menu Project clique em Add Class e informe o nome AcessoDB.cs e clique em Add;
Inclua os seguintes namespaces na classe AcessoDB:
using
System;using
System.Collections.Generic;using
System.Data;using
System.Data.SqlClient;using
System.Text;1- Definindo o método getDataTable() que retorna um DataTable
Defina o método estático getDataTable com o código abaixo:
public static DataTable getDataTable()
{
//define os objetos connection e dataadapter
SqlConnection conn = null;
SqlDataAdapter da = null;
//define a string de conexão e a instrução SQL
string connString = @"Data Source=.\sqlexpress;Initial Catalog=Cadastro;Integrated Security=True";
string consulta = "select * from Produtos";
try
{
//cria um datatable define a conexão e abre e executa um comando
DataTable dataTable = new DataTable();
conn = new SqlConnection(connString);
SqlCommand cmd = new SqlCommand(consulta, conn);
conn.Open();
// cria um data adapter
da = new SqlDataAdapter(cmd);
// preenche o datatable
da.Fill(dataTable);
//retorna o datatable
return dataTable;
}
catch(Exception ex)
{
throw ex;
}
finally
{
conn.Close();
da.Dispose();
}
}
|
O código é bem simples e apenas acessa a tabela Produtos do banco de dados Cadastro.mdf e retorna um objeto DataTable.
Definimos o método como estático de forma a não precisar criar uma instância da classe para acessar o método.
2- Definindo o método DataTable_JSON_StringBuilder() que converte o DataTable para JSON
Vamos agora definir o primeiro método para converter o DataTable para JSON usando o StringBuilder.
O método DataTable_JSON_StringBuilder() recebe o DataTable e utilizando o StringBuilder o converte para o formato JSON.
A seguir temos o código que faz isso percorrendo as linhas e colunas da tabela e formatando os dados para JSON:
public static string DataTable_JSON_StringBuilder(DataTable tabela) { var JSONString = new StringBuilder(); if (tabela.Rows.Count > 0) { JSONString.Append("["); for (int i = 0; i < tabela.Rows.Count; i++) { JSONString.Append("{"); for (int j = 0; j < tabela.Columns.Count; j++) { if (j < tabela.Columns.Count - 1) { JSONString.Append("\"" + tabela.Columns[j].ColumnName.ToString() + "\":" + "\"" + tabela.Rows[i][j].ToString() + "\","); } else if (j == tabela.Columns.Count - 1) { JSONString.Append("\"" + tabela.Columns[j].ColumnName.ToString() + "\":" + "\"" + tabela.Rows[i][j].ToString() + "\""); } } if (i == tabela.Rows.Count - 1) { JSONString.Append("}"); } else { JSONString.Append("},"); } } JSONString.Append("]"); } return JSONString.ToString(); }
|
3- Definindo o método DataTable_JSON_JavaSerializer() que converte o DataTable para JSON
Vamos agora definir o primeiro método para converter o DataTable para JSON usando o JavaSerializer.
Precisamos incluir o namespace using System.Web.Script.Serialization; no projeto, mas antes temos que incluir uma referência a biblioteca System.Web.Extensions no projeto.
No menu Project clique em Add Reference e clique em Assemblies;
Selecione a seguir o item System.Web.Extensions e clique no botão OK;
Pronto !. Agora inclua o namespace using System.Web.Script.Serialization; no projeto.
O método DataTable_JSON_JavaSerializer() recebe o DataTable e utilizando o JavaSerializer o converte para o formato JSON.
A seguir temos o código que faz isso percorrendo as linhas e colunas da tabela e formatando os dados para JSON:
public static string DataTable_JSON_JavaSerializer(DataTable tabela) { try { JavaScriptSerializer jsSerializer = new JavaScriptSerializer(); List<Dictionary<string, object>> parentRow = new List<Dictionary<string, object>>(); Dictionary<string, object> childRow; foreach (DataRow row in tabela.Rows) { childRow = new Dictionary<string, object>(); foreach (DataColumn col in tabela.Columns) { childRow.Add(col.ColumnName, row[col]); } parentRow.Add(childRow); } return jsSerializer.Serialize(parentRow); } catch { throw; } } |
4- Definindo o método DataTable_JSON_JsonNet() que converte o DataTable para JSON
Vamos agora definir o primeiro método para converter o DataTable para JSON usando a biblioteca NewtonSoft.
Precisamos incluir o namespace using System.NewtonSoft.Json; no projeto, mas antes temos que incluir uma referência a biblioteca Newtonsoft.Json no projeto.
No menu Tools clique Nuget Package Manager;
A seguir clique em Mange Nuget Packages for Solution;
Selecione a seguir o Browse e informe Newtonsoft.Json;
Selecione o pacote Newtonsoft.Json e clique no botão Install;
Pronto !. Agora inclua o namespace using System.NewtonSoft.Json; no projeto.
O método DataTable_JSON_JsonNet() recebe o DataTable e utilizando o JavaSerializer o converte para o formato JSON.
Este código é mais enxuto e usar o método JsonConvert da biblioteca para serializar a tabela retornando o JSON.
public static string DataTable_JSON_JsonNet(DataTable tabela)
{
try
{
string jsonString = string.Empty;
jsonString = JsonConvert.SerializeObject(tabela);
return jsonString;
}
catch
{
throw;
}
}
|
Agora é só alegria...
Já temos tudo pronto para obter um DataTable e convertê-lo para o formato JSON usando 3 métodos diferentes definidos na classe AcessoDB.
Obtendo e Convertendo o DataTable para JSON
Abra o formulário form1.cs e a seguir declare os seguintes namespaces no formulário form1.cs:
using
System;DataTable dt = null; |
1 - Obtendo o DataTable a partir do SQL Server
No evento Click do botão btnDataTable inclua o código a seguir que usa o método getDataTable() e obtém o datatable e exibe o resultado no DataGridView:
private void btnDataTable_Click(object sender, EventArgs e)
{
try
{
dt = new DataTable();
dt = AcessoDB.getDataTable();
dgvDados.DataSource = dt;
//habilita os botões para conversão
btnStringBuillder.Enabled = true;
btnJavaScriptSerializar.Enabled = true;
btnNewtonSoft.Enabled = true;
}
catch(Exception ex)
{
MessageBox.Show("Erro : " + ex.Message);
}
} |
2 - Convertendo o DataTable usando StringBuilder
No evento Click do botão btnStringBuilder inclua o código a seguir que usa o método DataTable_JSON_StringBuilder() da classe AccessoBD para converter para JSON.
private void btnStringBuillder_Click(object sender, EventArgs e)
{
try
{
txtDados.Text = "";
string resultado = AcessoDB.DataTable_JSON_StringBuilder(dt);
txtDados.Text = resultado;
lblJSON.Text = "JSON -> StringBuilder";
}
catch (Exception ex)
{
MessageBox.Show("Erro : " + ex.Message);
}
}
|
3 - Convertendo o DataTable usando o JavaSerializer
No evento Click do botão btnJavaScriptSerializar inclua o código a seguir que usa o método DataTable_JSON_JavaSerializer() da classe AccessoBD para converter para JSON.
private void btnJavaScriptSerializar_Click(object sender, EventArgs e)
{
try
{
txtDados.Text = "";
string resultado = AcessoDB.DataTable_JSON_JavaSerializer(dt);
txtDados.Text = resultado;
lblJSON.Text = "JSON -> JavaScriptSerializer";
}
catch (Exception ex)
{
MessageBox.Show("Erro : " + ex.Message);
}
}
|
4 - Convertendo o DataTable usando o NewtonSoft.Json
No evento Click do botão btnNewtonSoft inclua o código a seguir que usa o método DataTable_JSON_JsonNet() da classe AccessoBD para converter para JSON.
private void btnNewtonSoft_Click(object sender, EventArgs e)
{
try
{
txtDados.Text = "";
string resultado = AcessoDB.DataTable_JSON_JsonNet(dt);
txtDados.Text = resultado;
lblJSON.Text = "JSON -> NewtonSoft (Json.net)";
}
catch (Exception ex)
{
MessageBox.Show("Erro : " + ex.Message);
}
}
|
Executando o projeto iremos obter:
Fique a vontade para alterar o projeto e incrementar novas funcionalidades.
Pegue o projeto completo aqui: Converte_DataTable_Json.zip (sem as referências)
(Disse Jesus) "Eu sou a videira, vós as
varas; quem está em mim, e eu nele, esse dá muito fruto; porque sem mim nada
podeis fazer.
Se alguém não estiver em mim, será lançado fora, como a vara, e secará; e os
colhem e lançam no fogo, e ardem."
João 15:5,6
Veja os
Destaques e novidades do SUPER DVD Visual Basic
(sempre atualizado) : clique e confira !
Quer migrar para o VB .NET ?
Quer aprender C# ??
Quer aprender os conceitos da Programação Orientada a objetos ? Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ? |
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#