Usando JSON com o PHP
por Davis Zanetti Cabral

Iremos dar uma olhada sobre como usar JSON de uma forma pratica e rapida com PHP e o Services_JSON, um pacote da PEAR que esta pronto para ser usado em encode/decode de variaveis PHP.



Comecei a querer saber mais sobre JSON, quando comecei a analisar a comunicação que o Meebo.com fazia enquanto eu conversava com outras pessoas no MSN e GTalk usando ele. Vi que havia um certo padrão na comunicação, algo como o projeto JSON-RPC define:


--> {“method”: “postMessage”, “params”: [“Hello all!”], “id”: 99}
<-- {“result”: 1, “error”: null, “id”: 99}
<–- {“method”: “handleMessage”, “params”: [“user1&#8243;, “we were just talking”], “id”: null}
<–- {“method”: “handleMessage”, “params”: [“user3&#8243;, “sorry, gotta go now, ttyl”], “id”: null}
–-> {“method”: “postMessage”, “params”: [“I have a question:”], “id”: 101}
<-— {“method”: “userLeft”, “params”: [“user3&#8243;], “id”: null}
<–- {“result”: 1, “error”: null, “id”: 101}


Note a facilidade de comunicação, criada pelo padrão, entre client e server. JSON, notação do objeto JavaScript, pode ser usado para o intercâmbio de dados leves entre o javascript e outras linguagens.

Desde que o JSON possa ser diretamente executado em JavaScript, é um formato ideal para usar com interfaces Web 2.0; é uma alternativa mais simples do que usar XML para relações com AJAX. Fácil para humanos entenderem e ótimo para máquinas interpretarem.

Abaixo um exemplo de uso do Servico_JSON no php:


<?php
// O cerebro
include(‘JSON.php’);

// Um classe qualquer, apenas para entender-mos o funcionamento
class Chamado
{
    
// Propriedades
    
public $id;
    
public $atendente_id;
    
public $tramites;
    
public $assunto_principal;

    
// Construtor
    
public function __construct()
    {
        
$this->id 9999;
        
$this->atendente_id 9999;
        
$this->tramites = array(1510);
        
$this->assunto_principal ‘Oi eu sou um chamado teste’;
    }

    
// Metodo qualquer
    
public function ver()
    {
        echo 
[’ $this->id ]’ $this->atendente_id ‘ ‘ $this->assunto_principal;
    }
}
 
$chamado = new Chamado();
$json = new Services_JSON();
// Vai mostrar o codigo em JSON
echo $chamado $json->encode($chamado).“n“;
// Vai recuperar os dados
$chamado2 $json->decode($chamado);
// Note que o objeto e o padrao
print_r($chamado2);
// Tentativa de se chamar um metodo recuperado
$chamado2->ver();
?>


O resultado na proxima pagina.



Aqui temos o resultado:


{“id”:9999,“atendente_id”:9999,“tramites”:[1,5,10],“assunto_principal”:“Oi eu sou um chamado teste”}
stdClass Object
(
    [id] => 9999
    [atendente_id] => 9999
    [tramites] => Array
    (
        [0] => 1
        [1] => 5
        [2] => 10
    )
    [assunto_principal] => Oi eu sou um chamado teste
)
 
Fatal error:  Call to undefined method stdClass::ver() in C:htdocs    este.php on line 33


Note o erro. Esse erro é devido a ele não recuperar métodos do objeto. O ideal, é que quando se recupere um objeto, o mesmo seja criado novamente, e povoado com as propriedades recuperadas. Garantindo assim, a sua integridade.

Abaixo mostro um exemplo disso:


<?php
$chamado 
= new Chamado();
// Vamos alterar uns valores das propriedades
$chamado->id ‘lala’;
$chamado->atendente_id ‘lele’;
$chamado->tramites = array(1,2,3,4,5,6);
$chamado->assunto_principal ‘Mudamos todos os valores!;
$json = new Services_JSON();
$json_chamado $json->encode($chamado);
unset(
$chamado);
 
$chamado = new Chamado();
$decoded $json->decode($json_chamado);
foreach (
$decoded as $propriedade => $valor) {
    
$chamado->$propriedade $valor;
}
print_r($chamado);
 
// Agora o metodo funciona
$chamado->ver();
?>


Agora veja o resultado:


Chamado Object
(
    [id] => lala
    [atendente_id] => lele
    [tramites] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
        [4] => 5
        [5] => 6
    )
    [assunto_principal] => Mudamos todos os valores!
)
[lala]lele - Mudamos todos os valores!





Isso aqui é tema de vários artigos. Bom, já falei um pouco a respeito, e espero ter criado curiosidade. Espero que tenha servido para algo. No Javascript, o JSON, é só usar eval que ele se torna objeto. Na página do projeto, tem um parser qualquer coisa também.

Leia mais a respeito:

- PEAR :: Services_JSON - http://pear.php.net/pepr/pepr-proposal-show.php?id=198
- Projeto JSON - http://json.org
- JSON-RPC - http://www.raboof.com/json-rpc/JSON-RPC-1-1-WD-20060807.html
- Zend_Json - http://framework.zend.com/manual/en/zend.json.html

Update
Achei um link bem interessante no wiki do script.aculo.us. Muito bom e com definição simples, além de alguns exemplos muito mais simples. Acesse:
JSON on scriptaculos wiki - http://wiki.script.aculo.us/scriptaculous/show/json