Neste artigo vou dar uma introdução de como trabalhar com JSON no PHP. Primeiramente JSON (pronuncia-se “djeison”) significa JavaScript Object Notation ( Notação de Objetos JavaScript), é uma formatação leve para troca de dados. Para informações mais precisas acesse http://json.org/json-pt.html . Mas resumindo, é um vetorzão de dados transformado em uma string, que pode ser utilizada pelo JavaScript e pelo PHP. Uma boa, na verdade, ótima alternativa para o XML na utilização do AJAX.
Existem as funções json_decode e json_encode do PHP5 (http://br.php.net/manual/pt_BR/ref.json.php), mas nem todos os servidores as têm instalado, além de ter alguns erros de acentuação no retorno do json. Por isso vamos utilizar uma classe criada por Michal Migurski, Matt Knapp e Brett Stimmerman , (segue em anexo, linkar aqui “ json.php” ), esta classe pode ser usada em qualquer versão do PHP5 sem ter que mexer em configurações no servidor.
Na parte do AJAX, vou utilizar a biblioteca Prototype (http://prototypejs.org), vou mostrar dois exemplos da utilização do JSON, a primeira como resultado do responseText e outra retornando através do cabeçalho HTTP.
Os arquivos.

javascript/prototype.js: script do prototype, para quem não tem (http://prototypejs.org/download).
json.php : Classe JSON.
getvalores.php: arquivo que ira criar a string JSON e retornará para o ajax.
Index.php: arquivo principal.
PHP
<?php require_once("json.php"); $dados[0]["Nome"] = "Alexandre"; $dados[0]["Idade"] = "25 anos"; $dados[0]["Sexo"] = "Masculino"; $dados[1]["Nome"] = "Maria"; $dados[1]["Idade"] = "19 anos"; $dados[1]["Sexo"] = "Feminino"; $dados[2]["Nome"] = "Pedro"; $dados[2]["Idade"] = "31 anos"; $dados[2]["Sexo"] = "Masculino"; $json = new Json(); $resposta = $json->encode($dados); if($_POST["tipo"] == "texto"){ echo $resposta; }else{ } ?>www.revistaphp.com.br
Arquivo getvalores.php, nele é incluído a classe Json, e atribuido o vetor para ela criar a string JSON atravez do método encode(), no caso ficaria:
[{"Nome":"Alexandre","Idade":"25 anos","Sexo":"Masculino"},{"Nome":"Maria","Idade":"19 anos","Sexo":"Feminino"},{"Nome":"Pedro","Idade":"31 anos","Sexo":"Masculino"}]
Depois é verificado se ira retornar um responseText ou irá incluir essa string no cabeçalho X-JSON do HTTP.
JavaScript
<script type='text/javascript' src='javascript/prototype.js'></script> <script type='text/javascript' > function ajaxJson(tipo) { $('retorno').innerHTML = ""; var url = "getvalores.php"; var parametros = "?tipo="+tipo new Ajax.Request( url, { method: 'post', parameters: parametros, onComplete: function(resposta,json) { if(json){ $('retorno_json').innerHTML = json; for(x=0; x< json.length; x++ ){ $('retorno').innerHTML += json[x].Nome +"<br>"+ json[x].Idade +"<br>"+ json[x].Sexo +"<br>----<br>" ; } }else{ $('retorno_json').innerHTML = resposta.responseText; var objeto = eval('(' + resposta.responseText + ')'); for(x=0; x< objeto.length; x++ ){ $('retorno').innerHTML += objeto[x].Nome +"<br>"+ objeto[x].Idade +"<br>"+ objeto[x].Sexo +"<br>----<br>" ; } } } }); } </script> <input type="button" onclick="ajaxJson('texto')" value="Json por texto"/> <input type="button" onclick="ajaxJson('header')" value="Json por header HTTP"/> <script type='text/javascript' src='javascript/prototype.js'></script> <script type='text/javascript' > function ajaxJson(tipo) { $('retorno').innerHTML = ""; var url = "getvalores.php"; var parametros = "?tipo="+tipo new Ajax.Request( url, { method: 'post', parameters: parametros, onComplete: function(resposta,json) { if(json){ $('retorno_json').innerHTML = json; for(x=0; x< json.length; x++ ){ $('retorno').innerHTML += json[x].Nome +"<br>"+ json[x].Idade +"<br>"+ json[x].Sexo +"<br>----<br>" ; } }else{ $('retorno_json').innerHTML = resposta.responseText; var objeto = eval('(' + resposta.responseText + ')'); for(x=0; x< objeto.length; x++ ){ $('retorno').innerHTML += objeto[x].Nome +"<br>"+ objeto[x].Idade +"<br>"+ objeto[x].Sexo +"<br>----<br>" ; } } } }); } </script> <input type="button" onclick="ajaxJson('texto')" value="Json por texto"/> <input type="button" onclick="ajaxJson('header')" value="Json por header HTTP"/> <br><b>Retorno do JSON:</b><br> <div id="retorno_json"></div> <br><b>Retorno do JSON trablhado:</b><br> <div id="retorno"></div> www.revistaphp.com.br
No arquivo index.php, primeiramente é incluído o prototype.js. Na função ajaxJson, recebe como parâmetro uma string (“texto” ou “header”) que definira o tipo de retorno para do arquivo getvalores.php.
responseText
Caso for usado o responseText como retorno, deverá ser utilizado o primeiro parâmetro no caso “resposta” e aplicar um eval() dentro de “(“ nesta variável, criando assim um vetor de objetos. Exemplo:
var objeto = eval('(' + resposta.responseText + ')');

Retorno da requisição AJAX pelo response.
Cabeçalho X-JSON
Se for retornado pelo cabeçalho HTTP, o prototype tem um método especifico para isso, no caso o segundo parâmetro “json”, já retornando o vetor de objetos, sem precisar do uso do eval.
* Essa é uma funcionalidade própria do prototype, não sei se outras bibliotecas tem isso, ou como implementar na mão essa funcionalidade
.
Retorno da requisição AJAX pelo cabeçalho X-JSON.