Aprendendo PHP - JSON
Autor: Weslley Alves | Publicado: 2012-03-11T17:08:00-07:00








Olá meu caro leitor(a), em meu último post sobre&nbsp;Carregar dados em um Formulário com jQuery demonstrei um plugin feito com jQuery onde é carregado dados em um formulário utilizando JSON, porém utilizei dados já mantidos pelo arquivo JavaScript. Agora iremos ver como trabalhar com JSON no PHP. Antes de demonstrar as funções JSON nativas do PHP vou explicar um pouco sobre JSON.

Ao contrário da imagem do famoso (pelo menos na minha época) personagem de filmes de terror Jason o JSON (JavaScript Object Notation - Notação de Objetos JavaScript)  é um padrão de troca de informações entre Cliente (browser) e Servidor (PHP) assim como o XML que também é utilizado para essa funcionalidade.

Na linguagem JavaScript JSON é muito mais do que só para trocar informações entre o browser e servidor, mas também é uma forma de se utilizar OO em JavaScript, pois podemos criar Objects JSON com atributos e métodos (funções), mas não irei entrar em detalhes sobre JSON na linguagem JavaScript, pois não é o foco deste post.

JSON utiliza a notação "chave" com "valor" dando um exemplo bem simples seria como o CSS trabalha, pois informamos um elemento a ser inserido o estilo e dentro das chaves informamos o atributo e seu respectivo valor como o exemplo abaixo.
body {
    background-color: #c60;
}

Assim ao criarmos um JSON este terá um atributo com seu respectivo valor. Porém este valor tem um tipo, ou melhor falando é tipado, onde pode receber valores do tipo string, number,  array, boolean ou até mesmo um Object. Abaixo está um modelo de um JSON.
// Object JSON
var aluno = {
     nome   : 'Legolas Kun'
    ,email  : 'legolas@teste.com'
    ,cursos : [
         {nome: 'Análise de Sistemas', periodos: 5}
        ,{nome: 'Engenharia', periodos: 10}
    ]
};

O exemplo acima é feito na linguagem JavaScript para demonstrar como é a estrutura do Object JSON. A difinição do JSON é dado pelos atributos informados entre os caracteres de chaves.
Debugando o código: 
Linha #2 a #9: é a definição do Object JSON;
Linha #3 e #4: informamos dois atributos no Object "nome" e "email" com o valor do tipo string; 
Linha #5 a #8: é definido no atributo "cursos" um array de objetos;

As funções nativas para manipulação de JSON foram incluidas na verão 5.2 do PHP, pois antes era necessário a inclusão de um arquivo para fazer esta manipulação. Abaixo irei demonstrar as funções nativas do PHP e exemplos práticos de sua utilização.
Obs.: Os funções do PHP utilizam os dados em UTF8, ou seja, os dados passados para codificar/decodificar devem estar em UTF8.


Sintaxe da função json_encode():

json_encode(mixed $valor)
Cria um Object JSON através do dados passado pelo parâmetro. Conforme documentação esse parêmtro pode ser de qualquer tipo menos resource que é uma variável com conteúdo externo.
Parâmetros:
$valor (mixed): Valor que será criado o JSON
$retorno (string): Retorna a String com o JSON formatado
Geralmente o parâmetro que passamos para esta função é um Array de dados, pois assim é criado o JSON conforme a estrutura passada. Abaixo irei demonstrar alguns exemplos de como utilizar esta função.

Exemplo 1: Gerando um JSON através do Array
&lt;?php
// Array com os valores
$aluno = array(
    'nome'   =&gt; 'Legolas Kun',
    'email'  =&gt; 'legolas@teste.com' 
);
&nbsp;
// Exibindo no browser o JSON criado
echo json_encode( $aluno );
&nbsp;
/* 
Saída:
{"nome":"Legolas Kun","email":"legolas@teste.com"}
*/
?&gt;

Exemplo 2: Gerando um JSON com Objects
&lt;?php
// Array com os valores
$aluno = array(
    'nome'   =&gt; 'Legolas Kun',
    'email'  =&gt; 'legolas@teste.com',
    'cursos' =&gt; array(
        array(
            'nome'     =&gt; 'Analise de Sistemas',
            'periodos' =&gt; 5
        ),
        array(
            'nome'     =&gt; 'Engenharia',
            'periodos' =&gt; 10
        )
    )
);
&nbsp;
// Exibindo no browser o JSON criado
echo json_encode( $aluno );
&nbsp;
/* 
Saída:
{
    "nome":"Legolas Kun",
    "email":"legolas@teste.com"
    "cursos":[
        {
            "nome":"Analise de Sistemas",
            "periodos":5
        },
        {
            "nome":"Engenharia",
            "periodos":10
        }
    ]
}
*/
?&gt;

Esse último exemplo demonstra a criação de um Object JSON com um atributo recebendo um Array de Objects JSON veja a definição da estrutura do Array que foi criado. O índice "cursos" recebe um Array multidimensional. Desta forma será criado um atributo no JSON com um Array de Objetos.

Agora que vimos como criar um Object JSON no PHP iremos ver como decodificar um JSON no PHP. Esse recurso é muito utilizado (pelo menos por mim) para receber um Object JSON via Ajax e criar um Array com os dados do JSON enviado. Vamos para a função do PHP.


Sintaxe da função json_decode():

json_decode(string $json [, boolean $assoc])
Recebe uma string com o Object JSON e retora um Object do PHP ou um Array dos dados dependendo do segundo&nbsp;parâmetro&nbsp;da função.
Parâmetros:
$json (string): String com o JSON a ser decodificado
$assoc (boolean):&nbsp;Quando informado o valor true o retorno será um Array Associativo, caso contrário um Object do PHP. Por default este valor é false.
$retorno (mixed): Irá retornar um Object ou Array dependendo do segundo parâmetro da função.

Exemplo 3: Decodificando um JSON simples
&lt;?php
// JSON a ser decodificado
$json = '{"nome":"Legolas Kun","email":"legolas@teste.com"}';

var_dump( json_decode( $json ) );

/* 
Saída:
object(stdClass)[1]
  public 'nome' =&gt; string 'Legolas Kun' (length=11)
  public 'email' =&gt; string 'legolas@teste.com' (length=17)
*/
?&gt;
Exemplo 4: Decodificando um JSON simples para Array
&lt;?php
// JSON a ser decodificado
$json = '{"nome":"Legolas Kun","email":"legolas@teste.com"}';

var_dump( json_decode( $json, true ) );

/* 
Saída:
array
  'nome' =&gt; string 'Legolas Kun' (length=11)
  'email' =&gt; string 'legolas@teste.com' (length=17)
*/
?&gt;

Veja esses dois exemplos o Exemplo 3 retorna um Object com os dados do JSON já o Exemplo 4 retorna um Array com os dados do JSON. Abaixo está um exemplo de decodificação de um JSON com Objects.

Exemplo 5: Decodificando um JSON com Objects

&lt;?php
// JSON a ser decodificado
$json = '{
  "nome": "Legolas Kun",
  "email": "legolas@teste.com",
  "cursos": [
    {
      "nome": "Analise de Sistemas",
      "periodos": 5
    },
    {
      "nome": "Engenharia",
      "periodos": 10
    }
  ]
}';

var_dump( json_decode( $json ) );

/*
Saída:
object(stdClass)[1]
  public 'nome' =&gt; string 'Legolas Kun' (length=11)
  public 'email' =&gt; string 'legolas@teste.com' (length=17)
  public 'cursos' =&gt; 
    array
      0 =&gt; 
        object(stdClass)[2]
          public 'nome' =&gt; string 'Analise de Sistemas' (length=19)
          public 'periodos' =&gt; int 5
      1 =&gt; 
        object(stdClass)[3]
          public 'nome' =&gt; string 'Engenharia' (length=10)
          public 'periodos' =&gt; int 10
*/
?&gt;

Veja neste exemplo que cada atributo do JSON se tornou um atributo do Object (Class) do PHP e o atributo "cursos" é um Array com Objects. Veja os exemplos abaixo de como utilizar o retorno do JSON decodificado.

Exemplo 6: Manipulando os dados decodificados
&lt;?php
// JSON a ser decodificado
$json = '{
  "nome": "Legolas Kun",
  "email": "legolas@teste.com",
  "cursos": [
    {
      "nome": "Analise de Sistemas",
      "periodos": 5
    },
    {
      "nome": "Engenharia",
      "periodos": 10
    }
  ]
}';

// Criando o Array com os dados do JSON decodificado
$dadosJson = json_decode( $json, true );

// Saída: Nome: Legolas Kun Email: legolas@teste.com
echo sprintf( 'Nome: %s Email: %s',$dadosJson['nome'], $dadosJson['email'] );
?&gt;

Neste exemplo decodifico um JSON em um Array, como cada atributo do JSON virá um índice do Array de retorno podemos acessar os valores de cada atributo do JSON pelo índice do Array como é demonstrado na linha #22 do código acima.

No exemplo abaixo irei utilizar o retorno default da função de decodificação do JSON. Para acessar os dados que foram criados devemos usar o conceito da POO&nbsp;(Programação Orientada a Objetos). Sei que não mencionei sobre POO em meu blog, mas irei informar sucintamente no exemplo como acessar os dados do retorno da decodificação utilizando as notações da OO.Irei utilizar o mesmo exemplo acima porém retirando o segundo parâmetro da função:

&lt;?php
// JSON a ser decodificado
$json = '{
  "nome": "Legolas Kun",
  "email": "legolas@teste.com",
  "cursos": [
    {
      "nome": "Analise de Sistemas",
      "periodos": 5
    },
    {
      "nome": "Engenharia",
      "periodos": 10
    }
  ]
}';

// Criando o Object com os dados do JSON decodificado
$obj = json_decode( $json );

// Saída: Nome: Legolas Kun Email: legolas@teste.com Quantidade de Cursos: 2
echo sprintf( 'Nome: %s Email: %s Quantidade de Cursos: %d',$obj-&gt;nome, $obj-&gt;email, count( $obj-&gt;cursos ) );
?&gt;

Em PHP na POO para acessarmos os atributos&nbsp;públicos&nbsp;(de livre acesso) de um Object devemos informar o objeto da Classe e&nbsp;utilizar&nbsp;os caracteres -&gt; para informar qual atributo publico que queremos acessar. Veja na linha #22 que utilizamos a notação "$obj-&gt;nome". Estou informando que no Obejct de retorno eu irei acessar o valor do atributo "nome" da Classe. Assim exibindo o valor do atributo. Veja que eu informei o atributo dos cursos do objeto "$obj-&gt;cursos" dentro da função do PHP "count()". Esse atributo contém um Array com dois Objects PHP assim retornando o valor para a mensagem.

Por último porém não menos importante a função para resgatar o último erro ocorrido na Codificação/Decodificação do JSON. Infelizmente essa função só está habilitada na versão 5.3 ou superior do PHP.


Sintaxe da função json_last_error():

json_last_error()
Esta função não possui parâmetros e irá retornar o valor entre 0 e 5 que informa o tipo de erro que foi retornado, podemos utilizar as constantes do PHP para verificar o erro ocorrido na Codificação/Decodificação do JSON. Abaixo segue a tabela com as constantes:

    Constantes PHP
    

            Constante
            Valor
        

    

            JSON_ERROR_NONE
            0
        

            JSON_ERROR_DEPTH
            1
        

            JSON_ERROR_STATE_MISMATCH
            2
        

            JSON_ERROR_CTRL_CHAR
            3
        

            JSON_ERROR_SYNTAX
            4
        

            JSON_ERROR_UTF8
            5
        



Exemplo 7: Verificando alguns Erros da Decodificação

&lt;?php
// String válida do JSON
$json[] = '{"Nome": "Legolas Kun"}';

// Inválida String JSON, pois os valores devem estar entre ""
$json[] = "{'Nome': 'Legolas Kun'}";

// Inválida String JSON, pois não é um JSON válido
$json[] = '{"Son Gohan"}';

// LOOP para verificar os erros da Decodificação
foreach ($json as $string) {
    echo 'Decodificado: ' . $string;
    json_decode($string);

    switch (json_last_error()) {
        case JSON_ERROR_NONE:
            echo ' - Sem Erros';
        break;
        case JSON_ERROR_DEPTH:
            echo ' - Número de índice máximo excedido';
        break;
        case JSON_ERROR_CTRL_CHAR:
            echo ' - Caractere de controle inesperado encontrado';
        break;
        case JSON_ERROR_SYNTAX:
            echo ' - Erro na sintaxe do JSON';
        break;
        case JSON_ERROR_UTF8:
            echo ' - UTF-8 caracteres malformados, possivelmente incorretamente codificado';
        break;
        default:
            echo ' - Erro desconhecido';
        break;
    }

    echo '&lt;br /&gt;';
}

/*
Saída:
Decodificado: {"Nome": "Legolas Kun"} - Sem Erros
Decodificado: {'Nome': 'Legolas Kun'} - Erro na sintaxe do JSON
Decodificado: {"Son Gohan"} - Erro na sintaxe do JSON
*/
?&gt;

Com o exemplo acima vimos que é fácil verificar se a decodificação do JSON retornou algum erro utilizando as constantes do PHP.&nbsp;Espero ter sido claro nesta parte de JSON com PHP, pois é um dos recursos que mais utilizo e que vejo mais dúvidas nos fóruns.&nbsp;Deixem seu comentário com dúvidas, sugestões.
Um forte abraço e até o próximo post que irei falar sobre estrutura de repetição fechando a parte de PHP estruturado.

Fontes:
http://www.php.net/manual/pt_BR/ref.json.php 
http://www.json.org/
http://www.w3schools.com/xml/
http://www.w3schools.com/css/


 SyntaxHighlighter.highlight();