C# - Convertendo um DataTable para JSON


 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, JSON também pode ser visto 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 aplicação, 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:

Ex:   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:

Ex1: 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

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;

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:

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#

Versão VB .NET

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);
            }
 }
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:

Pegue o projeto completo aqui :   DataTable_Json.zip

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 ?

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti