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
Excelente explicação Rubens!
JSON é uma mão na roda, no ajax so uso ele.
Falou e ate mais.
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
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?
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.
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?
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
Uso muito json em serviços. Acho mais leve do que XML. Obrigado por compartilhar.
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com