Back-End

29 out, 2014

Convertendo um DataTable para JSON

Publicidade

O JavaScript Object Notation (ou JSON) é  um formato de intercâmbio de dados abertos e baseado em texto que fornece um formato de troca de dados padronizado mais adequado para aplicações baseadas em Ajax.

Obs: Assim como XML, o JSON também pode ser visto como uma alternativa ao modelo de dados relacional mais apropriadamente a dados semiestruturados.

Mas o que JSON tem a ver com a plataforma .NET, com VB .NET, C# e ASP .NET? Tudo!

Quando você cria uma aplicação que irá se comunicar com outra, quer seja ela local ou remota, você esta trocando informações; e neste caso, um formato de dados e um protocolo de troca deve ser selecionado para que a comunicação seja feita com sucesso. Por sucesso entende-se que quem recebe a informação consegue tratá-la e entender o seu significado.

Existem uma variedade de opções de protocolos abertos padronizados, tais como SOAP, XML, etc., que podem ser adotados e isso vai depender da finalidade e dos requisitos da sua aplicação.

Dessa forma, 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.

Os objetos JSON são definidos entre chaves {} e podem conter múltiplos pares nome:valor:

Exemplo:

var pessoa = { "nome" : "Jose Carlos" , "sobrenome" : "Macoratti" };
       var produto = {"ProdutoID":1, "Descricao":"Notebook 14", "ProdutoNumero":"PRD-5381"};

Os arrays em JSON são definidos entre colchetes [] e podem conter múltiplos objetos:

var cores = [ "Azul" , "Branco", "Vermelho", "Amarelo" ];
       var escola =
             {
              "alunos": [ { "nome":"Jose Carlos" , "sobrenome":"Macoratti" }, { "nome":"Ana" , "sobrenome":"Lima" }, { "nome":"Pedro" , "sobrenome":"Ramos" } ]
             }

Neste artigo, vou mostrar uma forma bem simples de converter um DataTable para o formato JSON usando a linguagem C# e também a VB .NET.

Recursos usados:

  • Visual Studio 2013 Express for Windows desktop
  • C# e VB .NET

Criando o projeto no VIsual Studio 2013

Abra o Visual Studio 2013 Express for web e clique em New Project;

Selecione a linguagem de sua preferência e clique em Web. Informe o nome DataTable_Json e no formulário form1.cs inclua, a partir da ToolBox, um controle Button name=btnConverter e um controle TextBox Multiline=true e name=txtJSON.

Defina o leiaute conforme a figura abaixo:

c_dtjson12

Agora, no menu PROJECT, clique em Add Class e informe o nome Suporte.cs.

A seguir, digite o código abaixo neste arquivo:

public string converteDataTabelParaJSON(DataTable dtb)
 {
         try
         {
             //define um array de strings
             string[] jsonArray = new string[dtb.Columns.Count];
             string headString = string.Empty;
             //percorre as colunas
             for (int i = 0; i < dtb.Columns.Count; i++)
             {
                 jsonArray[i] = dtb.Columns[i].Caption; // Array para todas as colunas
                 headString += "'" + jsonArray[i] + "' : '" + jsonArray[i] + i.ToString() + "%" + "',";
             }
             headString = headString.Substring(0, headString.Length - 1);
             //define um stringbuilder
             StringBuilder sb = new StringBuilder();
             sb.Append("[");
             if (dtb.Rows.Count > 0)
             {
                 for (int i = 0; i < dtb.Rows.Count; i++)
                 {
                     string tempString = headString;
                     sb.Append("{");
                     // pega cada valor do  datatable
                     for (int j = 0; j < dtb.Columns.Count; j++)
                     {
                         tempString = tempString.Replace(dtb.Columns[j] + j.ToString() + "%", dtb.Rows[i][j].ToString());
                     }
                     sb.Append(tempString + "},");
                 }
             }
             else
             {
                 string tempString = headString;
                 sb.Append("{");
                 for (int j = 0; j < dtb.Columns.Count; j++)
                 {
                     tempString = tempString.Replace(dtb.Columns[j] + j.ToString() + "%", "-");
                 }
                 sb.Append(tempString + "},");
             }
             sb = new StringBuilder(sb.ToString().Substring(0, sb.ToString().Length - 1));
             sb.Append("]");
             return sb.ToString(); // saida json formatada
         }
         catch (Exception ex)
         {
             throw ex;
         }
      }

Definimos o método converteDataTabelParaJSON(DataTable dtb) que recebe um DataTable e gera uma string com o formato JSON.

A versão para a linguagem VB .NET é dada a seguir:

Public Function converteDataTabelParaJSON(dtb As DataTable) As String
        Try
            'define um array de strings
            Dim jsonArray As String() = New String(dtb.Columns.Count - 1) {}
            Dim headString As String = String.Empty
            'percorre as colunas
            For i As Integer = 0 To dtb.Columns.Count - 1
                jsonArray(i) = dtb.Columns(i).Caption
                ' Array para todas as colunas
                headString += "'" + jsonArray(i) + "' : '" + jsonArray(i) + i.ToString() + "%" + "',"
            Next
            headString = headString.Substring(0, headString.Length - 1)
            'define um stringbuilder
            Dim sb As New StringBuilder()
            sb.Append("[")
            If dtb.Rows.Count > 0 Then
                For i As Integer = 0 To dtb.Rows.Count - 1
                    Dim tempString As String = headString
                    sb.Append("{")
                    ' pega cada valor do  datatable
                    For j As Integer = 0 To dtb.Columns.Count - 1
                        tempString = tempString.Replace(dtb.Columns(j).ToString() + j.ToString() & "%", dtb.Rows(i)(j).ToString())
                    Next
                    sb.Append(tempString & Convert.ToString("},"))
                Next
            Else
                Dim tempString As String = headString
                sb.Append("{")
                For j As Integer = 0 To dtb.Columns.Count - 1
                    tempString = tempString.Replace(dtb.Columns(j).ToString() + j.ToString() + "%", "-")
                Next
                sb.Append(tempString & Convert.ToString("},"))
            End If
            sb = New StringBuilder(sb.ToString().Substring(0, sb.ToString().Length - 1))
            sb.Append("]")
            ' saida json formatada
            Return sb.ToString()
        Catch ex As Exception
            Throw ex
        End Try
    End Function

Para testar, vamos definir o código abaixo no evento Click do botão de comando – Criar o DataTable e Converter para JSON -:

Versão C#

private void button1_Click(object sender, EventArgs e)
  {
            try
            {
                DataTable dtbContatos = new DataTable();
                //define a estrutura da 
                dtbContatos.Columns.Add("Id", typeof(int));
                dtbContatos.Columns.Add("Nome", typeof(string));
                dtbContatos.Columns.Add("Idade", typeof(string));	
                //preenche o datatable
                dtbContatos.Rows.Add(25, "Macoratti", "30");
                dtbContatos.Rows.Add(50, "Fabiana", "25");
                dtbContatos.Rows.Add(10, "Marcia", "19");
                dtbContatos.Rows.Add(21, "Janice", "22");
                //cria uma instância da classe Suporte
                Suporte sp = new Suporte();
                //chama o método para converter o datatable para JSON
                txtJSON.Text = sp.converteDataTabelParaJSON(dtbContatos);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
 }

Versão VB .NET

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            Dim dtbContatos As New DataTable()
            'define a estrutura do datatable
            dtbContatos.Columns.Add("Id", GetType(Integer))
            dtbContatos.Columns.Add("Nome", GetType(String))
            dtbContatos.Columns.Add("Idade", GetType(String))
            'preenche o datatable
            dtbContatos.Rows.Add(25, "Macoratti", "30")
            dtbContatos.Rows.Add(50, "Fabiana", "25")
            dtbContatos.Rows.Add(10, "Marcia", "19")
            dtbContatos.Rows.Add(21, "Janice", "22")
            'cria uma instância da classe Suporte
            Dim sp As New Suporte()
            'chama o método para converter o datatable para JSON
            txtJSON.Text = sp.converteDataTabelParaJSON(dtbContatos)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
    End Sub

Este código cria um DataTable bem simples com 3 colunas e inclui 4 registros chamado dtbContatos.

Para realizar a conversão, criamos uma instância da classe Suporte e a partir do objeto sp chamamos o método para realizar a conversão:

sp.converteDataTabelParaJSON(dtbContatos);

O resultado pode ser visto a seguir:

c_dtjson11

Pegue o projeto completo aqui: DataTable_Json.zip