Guia do artigo:

Uma introdução ao JSON

JSON (JavaScript Object Notation) é um modelo para armazenamento e transmissão de informações no formato texto. Apesar de muito simples, tem sido bastante utilizado por aplicações Web devido a sua capacidade de estruturar informações de uma forma bem mais compacta do que a conseguida pelo modelo XML, tornando mais rápido o parsing dessas informações. Isto explica o fato de o JSON ter sido adotado por empresas como Google e Yahoo, cujas aplicações precisam transmitir grandes volumes de dados.

Este artigo apresenta uma introdução ao formato JSON e está dividido da seguinte forma. A Seção 2 descreve a sintaxe da linguagem. Em seguida, na Seção 3 realiza-se uma comparação entre os modelos JSON e XML. A Seção 4 apresenta um exemplo de utilização prática do JSON em um programa Java - com o uso da biblioteca gson criada pelo Google. Por fim, na Seção 5 são apresentadas as conclusões e comentários finais.

Sintaxe no JSON

A ideia utilizada pelo JSON para representar informações é tremendamente simples: para cada valor representado, atribui-se um nome (ou rótulo) que descreve o seu significado. Esta sintaxe é derivada da forma utilizada pelo JavaScript para representar informações. Por exemplo, para representar o ano de 2012, utiliza-se a seguinte sintaxe:

Listagem 1: Representando o ano de 2012


    "ano": 2012

Um par nome/valor deve ser representado pelo nome entre aspas duplas, seguido de dois pontos, seguido do valor. Os valores podem possuir apenas 3 tipos básicos: numérico (inteiro ou real), booleano e string. As Listagens 2, 3, 4 e 5 apresentam exemplos. Observe que os valores do tipo string devem ser representados entre aspas.

Listagem 2: Representando um número real


    "altura": 1.72

Listagem 3: Representando uma string


    "site": “www.devmedia.com.br”

Listagem 4: Representando um número negativo


    "temperatura": -2

Listagem 5: Representando um valor booleano


    "casado": true

A partir dos tipos básicos, é possível construir tipos complexos: array e objeto. Os arrays são delimitados por colchetes, com seus elementos separados entre vírgulas. As listagens 6 e 7 mostram exemplos.

Listagem 6: Array de Strings


   [“RJ”, “SP”, “MG”, “ES”]

Listagem 7: Matriz de Inteiros


   [
     [1,5],
     [-1,9],
     [1000,0]
    ]

Os objetos são especificados entre chaves e podem ser compostos por múltiplos pares nome/valor, por arrays e também por outros objetos. Desta forma, um objeto JSON pode representar, virtualmente, qualquer tipo de informação! O exemplo da Listagem 8 mostra a representação dos dados de um filme.

Listagem 8: Objeto


   {
     “titulo”: “JSON x XML”,
     “resumo”: “o duelo de dois modelos de representação de informações”,
     “ano”: 2012,
     “genero”: [“aventura”, “ação”, “ficção”] 
    }

É possível representar mais de um objeto ou registro de uma só vez. Um exemplo é apresentado na Listagem 9, onde dois filmes são representados em um array.

Listagem 9: Array de objetos


[
   {
     “titulo”: “JSON x XML”,
     “resumo”: “o duelo de dois modelos de representação de informações”,
     “ano”: 2012,
     “genero”: [“aventura”, “ação”, “ficção”] 
    },
   {
     “titulo”: “JSON James”,
     “resumo”: “a história de uma lenda do velho oeste”,
     “ano”: 2012,
     “genero”: [“western”]  
    }
]

Por fim, é importante citar que a palavra-chave “null” deve ser utilizada para a representação de valores nulos (Listagem 10).

Listagem 10: Representando um valor nulo


    "site":null

JSON x XML

Podemos entender o JSON como uma espécie de “concorrente” da XML na área de troca de informações. Nesta seção, apresentamos algumas das principais semelhanças e diferenças entre os dois modelos para a representação de informações.

Semelhanças:

  • Os dois modelos representam informações no formato texto.
  • Ambos possuem natureza auto-descritiva (ou seja, basta “bater o olho” em um arquivo JSON ou em um arquivo XML para entender o seu significado).
  • Ambos são capazes de representar informação complexa, difícil de representar no formato tabular. Alguns exemplos: objetos compostos (objetos dentro de objetos), relações de hierarquia, atributos multivalorados, arrays, dados ausentes, etc.
  • Ambos podem ser utilizados para transportar informações em aplicações AJAX.
  • Ambos podem ser considerados padrões para representação de dados. XML é um padrão W3C, enquanto JSON foi formalizado na RFC 4627.
  • Ambos são independentes de linguagem. Dados representados em XML e JSON podem ser acessados por qualquer linguagem de programação, através de API’s específicas.

Diferenças:

  • JSON não é uma linguagem de marcação. Não possui tag de abertura e muito menos de fechamento!
  • JSON representa as informações de forma mais compacta.
  • JSON não permite a execução de instruções de processamento, algo possível em XML.
  • JSON é tipicamente destinado para a troca de informações, enquanto XML possui mais aplicações. Por exemplo: nos dias atuais existem bancos de dados inteiros armazenados em XML e estruturados em SGBD’s XML nativo.

JSON no Java

Ao acessar a home page oficial do JSON (www.json.org) você verá que existem parsers disponíveis para quase todas as linguagens: Delphi, PHP, Java, Matlab, C++, C#, etc. Uma coisa que me chamou a atenção quando acessei esta página é que, para a maioria das linguagens, estão disponibilizados vários parsers distintos. Por exemplo, para Java, existem nada mais de 20 parsers JSON diferentes!!!

Essa quantidade toda pode até intimidar os iniciantes em JSON. No universo XML a coisa é bem mais fácil, pois existem duas API’s básicas para o parsing de informações: SAX e DOM. Ambas já são instaladas junto com o Java e, daí, basta utilizá-las. Adicionalmente, o princípio de funcionamento das API’s SAX e DOM é bastante conhecido pelos desenvolvedores: DOM importa o documento todo para a memória, criando uma árvore, enquanto o SAX percorre o arquivo sequencialmente disparando eventos, sem realizar a importação de informações para a memória.

O JSON parece ainda não ter atingido esse grau maturidade. Várias pessoas/empresas implementaram os seus próprios parsers, com diferentes princípios de funcionamento. Como ainda não há um padrão, fica difícil decidir qual utilizar! Porém, como achei que seria interessante mostrar um exemplo prático de JSON dentro de um programa Java, optei por montar esse exemplo com o uso da biblioteca gson, que foi desenvolvida pelo Google, é bem documentada e simples de utilizar em seu “modo básico”. Para obter esta biblioteca, você deve acessar o site do projeto, http://code.google.com/p/google-gson/ e fazer o download do ZIP que contém os arquivos “.jar” que compõem do gson. Para o teste descrito neste artigo, a versão utilizada foi a 2.2.2.

Após a instalação da biblioteca, você poderá utilizá-la de uma forma tão simples que vai ficar assustado! Inicialmente, você deverá instanciar um objeto da classe Gson, do pacote com.google.gson.Gson. Para converter um objeto Java para JSON, utiliza-se o método toJson.E para fazer ao contrário, ou seja, atribuir o conteúdo de um objeto Java a partir de uma string Json, utiliza-se fromJson.

A Listagem 11 mostra um exemplo de uso do método “toJson”. Neste exemplo, o conteúdo de um objeto da classe Filme é convertido para o formato JSON, armazenado na variável string “aux” e depois exibido na tela. Veja que a classe Gson é inteligente o suficiente para entender a estrutura do objeto e modelar as suas informações no formato JSON.

Listagem 11: Método toJson


import java.util.ArrayList;

import com.google.gson.Gson;

  class Filme {
    public String titulo;
    public int ano;
    public ArrayList generos;
  }
    
  //classe com exemplo de uso do JSON
  //converte objeto Filme para uma string JSON
  public class GravandoJSON {
    
       public static void main(String[] args) {

        //instancia um filme e preenche suas propriedades
        Filme f = new Filme(); 
      f.titulo = "JSON x XML";
      f.ano = 2012;
      f.generos = new ArrayList();
      f.generos.add("Aventura");
      f.generos.add("Ação");
      f.generos.add("Ficção");
        
      //instancia um objeto da classe Gson        
      Gson gson = new Gson(); 
      
      //pega os dados do filme, converte para JSON e armazena em string
      String aux = gson.toJson(f);
      
      //imprime os resultados
      System.out.println(aux);
       }
}

O resultado é apresentado na Figura 1:

Resultado da execução do programa GravandoJSON

Figura 1: Resultado da execução do programa GravandoJSON

A seguir, na Listagem 12, apresenta-se um exemplo de uso do método “fromJson”. Desta vez, o conteúdo da String “aux” contém os dados do filme modelados no formato JSON. Esse conteúdo é transportado automaticamente para um objeto do tipo Filme, bastando realizar uma chamada ao método “fromJson”.

Listagem 12: Método fromJson


import java.util.ArrayList;

import com.google.gson.Gson;

  class Filme {
    public String titulo;
    public int ano;
    public ArrayList generos;
  }

      
  //classe com exemplo de uso do JSON
  //converte objeto Filme para uma string JSON
public class LendoJSON {
    

   public static void main(String[] args) {

  //string com informação representada em JSON 
      String aux = "{\"titulo\":\"JSON James\",\"ano\":2012,\"generos\":[\"Western\"]}";
         
  //instancia um objeto da classe Gson        
  Gson gson = new Gson(); 
      
  //instancia um filme e preenche seus dados com a informação vinda
//da string JSON
  Filme f = gson.fromJson(aux, Filme.class);
      
  //imprime os resultados
  System.out.println(f.titulo);
  System.out.println(f.ano);
  System.out.println(f.generos.toString());
  }
}

Observe que o método fromJson requisita os seguintes parâmetros: a string JSON e a classe do objeto que receberá os resultados. A Figura 2 mostra o resultado da execução do programa.

Resultado da execução do programa LendoJSON

Figura 2: Resultado da execução do programa LendoJSON

OBS: nos exemplos apresentados nesta seção, utilizamos strings para armazenar as informações JSON. No entanto, elas poderiam ter sido obtidas a partir de arquivos texto sem qualquer problema. Os arquivos com dados representados em JSON costumam ter a extensão “.json”.

Conclusões e Comentários Finais

Neste artigo, apresentamos os conceitos fundamentais sobre o modelo JSON para a representação de informações - atualmente muito utilizado em aplicações AJAX. Através do JSON podemos representar informações de uma forma mais compacta, rápida e simples do que na XML. Em contrapartida, a XML é uma linguagem mais rica, que possui um maior número de aplicações e um maior grau de maturidade. Existem inúmeros parsers para JSON, disponíveis para praticamente todas as linguagens. O artigo apresentou um exemplo de programa Java que fez uso da biblioteca “gson”, desenvolvida pelo Google.

Confira também