JSON (JavaScript Object Notation)

Artigo que explica o que é o JSON (JavaScript Object Notation), onde ele é usado, e como pode ser manipulado através do PHP e do JavaScript.

Introdução

JSON (JavaScript Object Notation) é um mecanismo de codificação/decodificação de valores para intercâmbio de dados. Ele é nativo da linguagem JavaScript, mas outras linguagens dão suporte ao mecanismo em função de sua simplicidade. PHP possui uma extensão que consegue codificar/decodificar valores de JSON para os tipos correspondentes do PHP e vice-versa. O funcionamento é semelhante ao visto nas funções serialize e unserialize, a diferença é que a linguagem JavaScript compreende um pacote codificado com JSON nativamente, mas não compreende um pacote codificado com serialize nativamente.

A extensão possui duas funções principais:

  • json_encode - Codifica um valor PHP para notação JSON
  • json_decode - Decodifica um valor da notação JSON para um objeto ou array em PHP

Exemplo:

$array = array(0 => 12, 1 => 45.3, 'x' => 'abc');
$json = json_encode($array);
echo $json; // Imprime: {"0":12,"1":45.3,"x":"abc"}

$array2 = json_decode($json, true); // $array2 é igual ao $array

O parâmetro "true" passado para json_decode indica que o resultado será decodificado na forma de array associativo. Caso contrário, o resultado com um pacote de dados seria decodificado na forma de um objeto da classe stdClass. Caso um tipo primitivo fosse codificado, ele seria restaurado para o tipo primitivo correspondente do PHP.

Utilização Prática

O mecanismo pode ser usado no PHP para passar informações para um JavaScript. Por exemplo, em uma requisição assíncrona (semelhante a Ajax, mas usando pacotes JSON ao invés de XML).

Também pode ser usado para decodificar um valor passado por um JavaScript. Por exemplo, em uma requisição assíncrona em que o JavaScript manda por POST um único valor empacotado com JSON.

JSON no lado JavaScript

Na linguagem JavaScript, é permitido criar pacotes dinâmicos de dados usando a notação JSON. É semelhante à classe stdClass do PHP, onde você pode incluir ou remover atributos dinamicamente. A vantagem de JSON é que lhe permite criar atributos no momento de criação do objeto. Veja exemplos:

// Trecho JavaScript

// Criando um objeto com atributos usando notação JSON embutida do JavaScript
var obj = {"x":3,"y":4};

// Obtendo os valores
var x = obj.x;
var y = obj.y;

// Criando um objeto vazio
var obj2 = {};

// Definindo novos atributos dinamicamente
obj2.nome = "Rubens";
obj2.site = "http://rubsphp.blogspot.com/";

// Convertendo o objeto do JavaScript para JSON na forma de string
var pacote_json = JSON.stringify(obj2);

// Criando um objeto com um pacote JSON codificado numa string
var obj3 = eval('(' + pacote_json + ')');

O método JSON.stringify é também uma boa solução para destrinchar o conteúdo de uma variável em JavaScript. É semelhante a fazer um var_dump sobre uma variável PHP, mas o resultado será na notação JSON, que é relativamente simples de ser lida por humanos.

Note que, para decodificar um pacote JSON, foi necessário incluir parênteses. Isso foi feito para evitar erros de interpretação de objetos (por exemplo, a mensagem "invalid label" do Firefox).

7 comentários

Lucas disse...

Excelente explicação Rubens!
JSON é uma mão na roda, no ajax so uso ele.

Falou e ate mais.

Rodolfo Nogueira disse...

Excelente artigo amigo. Me ajudou muito a informação sobre a referência de objetos no javascript. Legal mesmo a interação dos JSON com o stringfy, que é bem bacana também. Seria legal também algo sobre classes com JSON em java, seria muito bem vindo!!

Abraços amigo!
Rodolfo Jorge Nemer Nogueira
Curitiba / Paraná
UFPR - Música

Julio disse...

Apesar do tópico ser antigo, gostaria de fazer uma pergunta.
Tenho um variavel que recebe dados javascript convertidos em string com o stringify.
$var dados = JSON.stringify(dado);

como passar esses valores para uma variavel em php?

Rubens Takiguti Ribeiro (autor do blog) disse...

Olá, Julio

Normalmente os dados são passados do JavaScript para o PHP através de requisições assíncronas.

Um pacote de dados JSON pode ser enviado por uma variável via POST ou GET, então você faz um json_decode($_GET['var']) no PHP.

www.isay.com.br disse...

Olá Rubens , eu tenho um problema ao passar um texto com simbolos do Twitter tipo ✈,♆,♛,♥, via $.getJSON , para uma página em PHP usando o $_GET para receber , dai o texto vem porem no lugar destes símbolos vem um sinal de ? , será que vc pode me ajudar?

Rubens Takiguti Ribeiro (autor do blog) disse...

Olá,
Estes símbolos que você mostrou não são do Twitter. São símbolos Unicode. O JSON é transmitido em Unicode, então o problema deve ser no lado do PHP. Se você tenta converter o conteúdo recebido pelo JSON para ISO-8859-1, estes símbolos se tornam "?", pois eles não existem na tabela ISO-8859-1. Para mais informações, leia o artigo:
http://rubsphp.blogspot.com.br/2010/10/unicode.html