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 :

  1. Usar StringBuilder
  2. Usar JavaScriptSerializar
  3. Usar Json.Net
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 :

  • JSON é texto simples
  • JSON é "auto-descritivo" (legível)
  • JSON é hierárquico (valores dentro de valores)
  • JSON pode ser analisado pelo JavaScript
  • JSON os dados podem ser transportadas usando AJAX

mas é diferente da XML:

  • Não utiliza a tag de fechamento
  • É mais curto e simples
  • É mais rápido de ler e escrever
  • Pode ser analisado usando a função eval() do JavaScript
  • Utiliza matrizes
  • Não possui palavras reservadas
  • Possui parser nas principais linguagens e navegadores

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:

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;
using
System.Data;
using
System.Windows.Forms;

No início do formulário vamos declarar a variável dt que representa o nosso datatable e que iremos usar no projeto:

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:


José Carlos Macoratti