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:
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:
Pegue o projeto completo aqui: DataTable_Json.zip