Introdução
JSON, acrônimo para JavaScript Object Notation, é uma formatação leve de texto para troca de dados computacionais. Fácil de ler e entender por nós, seres humanos, e fácil de ser interpretado e gerado pelas máquinas.
É um subconjunto de notação da linguagem de programação JavaScript, Standard ECMA-262 3ª Edição – Dezembro – 1999, mas sua utilização não requer exclusivamente o JavaScript propriamente dito. JSON é completamente independente de linguagem, pois utiliza convenções familiares às linguagens C e similares (C++, C#, Java, JavaScript, Perl, Python e várias outras). Tais propriedades tornam o JSON um formato ideal de intercâmbio de dados. Foi criado originalmente por Douglas Crockford e é descrito no RFC (Request for Comments) 4627.
A simplicidade do JSON tem resultado em sua utilização bastante difundida, especialmente como uma alternativa para XML em AJAX. Uma das vantagens do JSON em relação ao XML é o fato de ser bem mais fácil escrever um analisador JSON. Em JavaScript, JSON pode ser analisado através do uso trivial da função “eval()”. Fato esse muito importante para a aceitação do JSON na comunidade AJAX devido à presença deste recurso de JavaScript em todos os navegadores web atuais.
Tipos de estruturas JSON
JSON é constituído por duas estruturas:
-
Uma coleção de pares nome/valor. Em muitas linguagens, estas estruturas caracterizam-se como: object, record, struct, dicionário, hash table, keyed list ou arrays associativas.
-
Uma lista ordenada de valores. Na maioria das linguagens, este tipo de estrutura é caracterizada como um array, vetor, lista ou sequência.
Os tipos de estruturas de dados citados acima são universais. Todas as linguagens de programação modernas, as suportam, virtualmente, de uma forma ou de outra. O fato de um formato de intercâmbio de dados ser independente da linguagem, e que se baseie nestas estruturas é aceitável.
Apresentação de dados
Um objeto é um conjunto desordenado de pares nome/valor. Um objeto começa com { (chave de abertura) e termina com } (chave de fechamento). Onde cada nome é seguido por : (dois pontos) e os pares nome/valor são seguidos por , (vírgula).
Um array é uma coleção de valores ordenados. O array começa com [ (colchete de abertura) e termina com ] (colchete de fechamento). Os valores são separados por , (vírgula)
Um valor pode ser uma cadeia de caracteres (string), ou um número, ou true, ou false, ou null, ou um objeto, ou um array. Estes tipos de estruturas também podem estar aninhadas.
Uma string é uma coleção de nenhum ou mais caracteres Unicode, envolvido entre aspas duplas utilizando barras invertidas. Um caractere é representado como um um simples caractere string. Neste tipo de estrutura, uma string é muito parecida com uma string em C ou em Java.
Um número é similar a um número em C ou em Java, exceto quando não se utilizam números octais ou hexadecimais.
Espaços em branco podem ser inseridos entre quaisquer pares de símbolos. Exceto em alguns detalhes da codificação, que descrevem completamente a linguagem de programação.
JSON em plataformas mobile
Os aplicativos para plataformas mobile estão em alta nos dias de hoje. Dispositivos como tablets e smartphones são mais vendidos que computadores tradicionais em várias partes do mundo. Fornecidos com plataformas tais como iOS e Android, estes dispositivos possuem APIs (Application Program Interfaces) para criar e converter objetos JSON como parte da plataforma, tornando a vida dos desenvolvedores de aplicativos um pouco mais simples.
JSON é um excelente meio de comunicação com clientes e serviços web, sendo estes clientes aplicações web ou tradicionais.
No caso dos aplicativos mobile, que muitas vezes operam em áreas com bandas mais baixas, a utilização dos objetos JSON, que funcionam com menor consumo de banda, pois os pacotes de informação a serem trocadas são menores se comparados ao XML, o que é muito favorável neste ambiente, pois quanto menor o consumo de banda, melhor será a comunicação com o servidor, o processamento de informações será mais eficiente e, logo, a aplicação será mais rápida.
As plataformas mobile líderes de mercado são Android e iOS. O Android funciona a partir de uma variante do Linux, suporta desenvolvimento de software em Java, o que permite um processador JSON. Já o iOS, ligeiramente derivado dos sistemas Mac e BSD (Berkeley Software Distribution), permitem desenvolvimento de software em Objective-C, Swift, C e C++, embora para o desenvolvimento da maioria das aplicações é utilizado Objective-C ou Swift, onde cada uma destas linguagens de programação possui ligação com a classe “NSJSONSerialization”, a qual implementa conversão e serialização de objetos JSON.
Convertendo JSON no Sistema Android
O Android fornece a classe “JSONObject”. A qual nos permite representar os pares nome/valor dos documentos JSON através de uma interface que, conceitualmente, é similar a um mapa e inclui tanto a serialização quanto a desserialização através dos métodos “getter” e “setter” que acessam os campos nomeados de um objeto JSON.
Como se faz?
Em primeiro lugar, iniciliza-se o “JSONObject” com o JSON a ser analisado (convertido), e então utiliza-se de vários métodos “get” para obter os valores dos campos JSON.
import org.json.JSONObject; String json = “...”; JSONObject data = new JSONObject(data); String call = data.getString(“call”); double lat = data.getDouble(“lat”); double lng = data.getDouble(“lng”);
Como funciona?
O construtor “JSONObject” utiliza o JSON para converter e através de seus métodos acessa os campos do JSON. Neste caso, foram usados “getString” e “getDouble” para acessar os campos “call”, “lat” e “lng” do JSON, respectivamente.
Gerando JSON no Sistema Android
A classe “JSONObject” também suporta métodos “setter” para inicializar dados em um mapa JSON. Com estes métodos é possível atribuir dados a um objeto JSON e então obter a representação JSON invocando o método “toString”.
Como se faz?
Observe o exemplo:
import org.json.JSONObject; JSONObject data = new JSONObject(); data.put(“call”, “kf6gpe-7”); data.put(“lat”, 37.40150); data.put(“lng”, -122.03683);
Como funciona?
O método polimórfico “put” atribui elementos do tipo integer, long integer, object, Boolean ou double a campos e valores especificados.
A classe “JSONObject” define o método “toString”, o qual usa um número opcional de espaços para indentar estruturas aninhadas para retornar em formato JSON. Caso não seja utilizada esta indentação, ou se passe “0”, a implementação codifica o JSON da maneira mais compacta possível.
Convertendo JSON no iOS em Objective-C
As bibliotecas de classe do Objective-C definem a classe “NSJSONSerialization”, a qual pode serializar “de” e “para” JSON. Elas convertem JSON para objetos de valor “NSDictionary”, com as chaves os nomes dos campos no JSON e seus respectivos valores em formato JSON. Está disponível em iOS a partir da versão 5.0.
Como se faz?
Observe o exemplo:
NSError* error; NSDictionary* data = [ NSJSONSerialization JSONObjectWithData: json options: kNilOptions error: &error ]; NSString* call = [ data ObjectForKey: @”call” ];
Como funciona?
A classe “NSJSONSerialization” possui um método, “JSONObjectWithData:options:error”, que utiliza opções de conversão “NSString” e um local para gravar erros, e então realiza a conversão em JSON.
Gerando JSON no iOS em Objective-C
Pode-se também utilizar a classe “NSJSONSerializer” para serializar o “NSDictionary” ou “NSArray” através do método “dataWithJSONObject”.
Como se faz?
Observe o exemplo onde assume-se que os dados que se deseja converter em JSON são “NSDictionary”:
NSError *error; NSData* jsonData = [ NSJSONSerialization dataWithJSONObject: data options: NSJSONWritingPrettyPrinted error: &error ];
Como funciona?
O método “dataWithJSONObject:options:error” pode utilizar “NSArray” ou “NSDctionary” e retorna um blob “NSData” com os objetos JSON codificados do conjunto de dados enviados. Se forem enviados “kNilOptions”, o JSON será codificado de maneira compacta. Para o modo “pretty-printed” JSON, envie a opção “NSJSONWritingPrettyPrinted”.
Convertendo JSON no iOS usando Swift
A mesma classe “NSJSONSerialization” está disponível em Swift, A nova linguagem de programação da Apple para desenvolvimento iOS.
Como se faz?
Exemplo de como invocar o método “JSONObjectWithData” da classe “NSJSONSerialization” em Swift:
import Foundation var error: NSError? let json: NSData = /* the JSON to parse */ let data = NSJSONSerialization.JSONObjectWithData(json, options: nil, error: &error);
Como funciona?
A invocação de métodos em Swift se parecem com invocação de funções, com os argumentos passados (nomes são opcionais) delimitados por vírgula, similar ao modo como é feito em C++ ou Java. Os argumentos para “JSONObjectWithData” são idênticos aos argumentos dos métodos na versão em Objective-C.
Gerando JSON no iOS usando Swift
Pode-se também, é claro, invocar o método “NSJSONSerialization.dataWithJSONObject” com Swift, que retorna um objeto “NSData” que então pode ser convertido em string.
Observe o exemplo abaixo:
var error: NSError? var data: NSJSONSerialization.dataWithJSONObject( dictionary, options: NSJSONWritingOptions(0), error: &error); var json: NSString(data: data, encoding: NSUTF8StringEncoding);
Como funciona?
O método “dataWithJSONObject” opera da mesma maneira que em Objective-C. Uma vez que os dados são recebidos em “NSData” contendo a versão do dicionário codificada em JSON, estes são convertidos para “NSString” através de seu próprio construtor.
Convertendo JSON usando Qt
A implementação Qt de conversão em JSON é atualmente bem similar à sua interface na versão do Android. Qt define as classes “QjsonObject” e “QjsonArray”, as quais podem conter mapas e arrays JSON, respectivamente. A conversão é feita pela classe “QjsonDocument” que possui um método estático “fromJson” que aceita objetos JSON e realiza a conversão necessária.
Como se faz?
Observe o exemplo a seguir:
QString json = “{ 'call': 'kf6gpe-7', 'lat': 37.40150, 'lng': -122.03683, 'result': 'ok' }”; QJsonDocument document = QJsonDocument.fromJson(json); QJsonObject data = document.object; QString call = data[“call”].toString();
Como funciona?
A conversão é em dois passos: primeiro, o código converte o JSON usando “QjsonDocument” e então utiliza o “QjsonObject” resultante para acessar os dados.
Comentários