C# - Lendo strings e arquivos no formato JSON


 Neste artigo eu vou apresentar os conceitos básicos sobre JSON e mostrar como ler strings e arquivos no formato JSON usando C#.

JSON significa JavaScript Object Notation e é um padrão aberto para representar dados como atributos com valores.

Originalmente derivado da sintaxe do JavaScript (daí o seu nome) para uso em aplicações web como uma alternativa ao XML, é agora usado para serialização      de dados e de transporte em muitas aplicações standalone e web.

JSON fornece um meio ideal para encapsular os dados entre o cliente e o servidor.

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.

Dessa forma JSON lembra XML :

mas é diferente da XML:

Assim, JSON é menor do que XML, é mais rápido e mais fácil de analisar.  O motivo principal para usar JSON é que em aplicações web com AJAX, JSON é muito mais rápido e fácil de usar do que XML.

As principais regras de sintaxe JSON são:

Basicamente o JSON se baseia na notação NOME : VALOR, onde NOME pode ser o nome que você deseja usar para identificar um objeto e VALOR o valor deste objeto.

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:

Exemplo :   

var cores = [ "Azul" , "Branco", "Vermelho", "Amarelo" ];

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual C# e o template Console Application

Informe o nome C_JSON e clique no botão OK;

Para podermos trabalhar com JSON vamos incluir a referência ao namespace System.Web.Extensions em nosso projeto.

No menu Project clique em Add Reference a seguir selecione o namespace conforme mostra a figura abaixo:

Agora vamos definir os seguintes namespaces no arquivo Program.cs:

using System;
using
System.Collections.Generic;
using
System.Web.Script.Serialization;

A seguir defina o código abaixo no arquivo Program.cs:

using System;
using System.Collections.Generic;
using System.Web.Script.Serialization;

namespace CSharp_Json
{
    class Program
    {
        static void Main(string[] args)
        {
            JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

            string json = @"{ ""nome"" : ""Jose Carlos"", ""sobrenome"" : ""Macoratti"", ""email"": ""macoratti@yahoo.com"" }";

            dynamic resultado = serializer.DeserializeObject(json);

            Console.WriteLine("  ==  Resultado da leitura do arquivo JSON  == ");
            Console.WriteLine("");

            foreach (KeyValuePair<string, object> entry in resultado)
            {
                    var key = entry.Key;
                    var value = entry.Value
as string;
                    Console.WriteLine(String.Format("{0} : {1}",
key, value));
            }

            Console.WriteLine("");
            Console.WriteLine(serializer.Serialize(resultado));
            Console.WriteLine("");
            Console.ReadKey();
        }
    }   
}

O assembly System.Web.Extensions fornece a classe JavaScriptSerializer no namespace System.Web.Script.Serialization.

O método Main define uma instância de JavaScriptSerializer e a seguir uma string contendo nosso JSON que desejamos ler.

Analisar o JSON é tão fácil como chamar o método DeserializeObject da instância JavaScriptSerializer, que retorna um objeto cujo tipo é determinado em tempo de execução com base no JSON que você passar.

O método DeserializeObject retorna um Dictionary de pares key-values, onde as chaves são os atributos no JSON e os valores são os objetos representando os valores dos atributos.

Em nosso exemplo percorremos as chaves(keys) e valores (values) no dicionário imprimindo cada uma delas.

Como sabemos o tipo do valor no JSON podemos simplesmente dar um cast para o tipo apropriado (string) usando a palavra chave as; (se o tipo não for string receberemos o valor null).

A classe JavaScriptSerializer também possui um método Serialize; podemos passá-lo como um dicionário de pares atributo-valor como fizemos com o resultado.

Executando o projeto iremos obter:

Para ler um arquivo JSON externo localizado no sistema de arquivos podemos usar o seguinte código definido no método

using System;
using
System.Collections.Generic;
using
System.IO;
using
System.Web.Script.Serialization;

 static void LerArquivoJson(string arquivo)
 {
            JavaScriptSerializer serializer = new System.Web.Script.Serialization.JavaScriptSerializer();

            using (StreamReader r = new StreamReader(arquivo))
            {
                string json = r.ReadToEnd();
                dynamic array = serializer.DeserializeObject(json);
                Console.WriteLine("");
                Console.WriteLine(serializer.Serialize(array));
                Console.WriteLine("");
                Console.ReadKey();
          }
  }

A chamada deste método poderia ser feita assim :   LerArquivoJson(@"c:\dados\arquivoJson.json");

Existe uma maneira mais simples de obter o mesmo resultado usando o framework Json.NET que possui muitos recursos para ler e escrever no formato JSON, mas isso é assunto para outro artigo.

Pegue o projeto completo aqui : CSharp_Json.zip

(Disse Jesus aos fariseus) Hipócritas, bem profetizou Isaías a vosso respeito, dizendo:
Este povo se aproxima de mim com a sua boca e me honra com os seus lábios, mas o seu coração está longe de mim.
Mas, em vão me adoram, ensinando doutrinas que são preceitos dos homens.

Mateus 15:7-9


Referências:


José Carlos Macoratti