JSON (JavaScript Object Notation ou Notação de Objetos em JavaScript) é uma formatação de dados muito leve, usada bastante na troca de informações entre aplicações.
Isso significa que usando JSON podemos criar sistemas ou APIs em alguma linguagem específica, como o PHP, e disponibilizar os dados sem precisar nos preocupar sobre qual linguagem irá consumir esses dados, seja ela JavaScript ou qualquer outra linguagem de programação. Isso é algo incrível!
Neste artigo iremos falar sobre como manipular JSON no PHP. Para isso, iremos falar sobre as funções voltadas para isso.
json_encode() - Convertendo uma variável em JSON
O primeiro parâmetro que essa função espera é a variável que irá ser convertida em uma string JSON. Geralmente usamos essa função para converter um array em JSON, mas essa variável pode ser qualquer valor.
Para o primeiro exemplo, iremos criar um array multidimensional de linguagens de programação. Cada item do array irá exibir o nome completo e nome curto da linguagem. Após criá-lo, iremos chamar a função json_encode():
<?php
$languages = [
[
"name"=>"PHP 7",
"short_name"=>"PHP"
],
[
"name"=>"JavaScript",
"short_name"=>"JS"
],
[
"name"=>"Vue JS",
"short_name"=>"Vue"
]
];
echo json_encode($languages);
Ao acessar nosso arquivo no servidor, vemos o seguinte resultado:
Nosso JSON foi corretamente exibido no navegador. Bem simples, não é mesmo?
Nós executamos essa função em um array multidimensional. Mas e se tivermos um array simples para converter para JSON? O que ocorre neste caso? Vamos ver agora! Iremos criar um array de cursos e chamar novamente a função json_encode():
$courses = ['PHP7', 'JavaScript', 'MySQL', 'Vue'];
echo json_encode($courses);
Veremos o seguinte resultado no navegador:
Nenhum erro foi retornado. Mas perceba que os colchetes continuaram. Parece que continua como um array. Como poderíamos forçá-lo a ser um objeto, usando chaves, como no primeiro exemplo? Para resolver essa questão, podemos usar um recurso muito interessante da função json_encode(). Essa função espera um segundo parâmetro, que são as opções de formatação do JSON. Essas opções são constantes do PHP. Podemos encontrar uma lista completa dessas constantes na documentação do PHP. Mas não se preocupe, pois iremos falar sobre algumas delas neste artigo.
Forçando um JSON a ser um objeto
O primeiro exemplo pode ser forçar um JSON a ser um objeto. Para isso, usaremos este código:
echo json_encode($courses, JSON_FORCE_OBJECT);
Ao atualizar o navegador, vemos o seguinte resultado:
Agora sim nosso JSON está com notação de objeto.
Há outras opções que podem nos ajudar em algumas situações específicas. Vamos ver alguns exemplos.
Convertendo strings em números
Vamos criar um array que mostre o nome de várias linguagens e seus respectivos anos de lançamento:
$languages = [htpp
[
'name'=>'PHP',
'release_year'=>'1994'
],
[
'name'=>'JavaScript',
'release_year'=>'1995'
],
[
'name'=>'SQL',
'release_year'=>'1974'
]
];
Ao chamar a função json_encode() nesta variável, veremos o seguinte resultado:
Nosso JSON foi retornado corretamente. Contudo, o ano de lançamento foi exibido como uma string, pois está entre aspas. Não faria mais sentido se ele fosse exibido como um número de fato? Para realizar essa conversão, podemos usar a opção JSON_NUMERIC_CHECK em nosso código, dessa forma:
echo json_encode($languages, JSON_NUMERIC_CHECK);
Agora, ao visualizar o navegador novamente, vemos o seguinte resultado:
Perfeito! Agora os anos foram retornados como números de fato, sem as aspas.
Trabalhando com URLs no JSON
A próxima situação que iremos aprender é quando precisamos trabalhar com URLs em JSON. Vamos criar um novo array de cursos, que irá retornar o nome do curso e sua URL:
$courses = [
[
"name"=>"PHP7",
"url"=>"https://www.hcode.com.br/cursos/PHP7"
],
[
"name"=>"JavaScript",
"url"=>"https://www.hcode.com.br/cursos/JSFULL"
],
[
"name"=>"MySQL",
"url"=>"https://www.hcode.com.br/cursos/MYSQL"
],
[
"name"=>"Vue",
"url"=>"https://www.hcode.com.br/cursos/VUE"
]
];
Agora, vamos realizar o encode deste array:
echo json_encode($courses);
O resultado será este:
Note que nossas URLs foram exibidas com as barras “duplicadas”. O que ocorre é que essas barras estão sendo “escapadas” pelo JSON. Para resolver essa questão, vamos usar a constante JSON_UNESCAPED_SLASHES:
echo json_encode($courses, JSON_UNESCAPED_SLASHES);
O resultado agora será o seguinte:
Excelente, nossas URLs estão bem mais fáceis de ler!
Uma dica para visualização do JSON
Podemos aproveitar esse momento para passar uma dica muito legal. Estamos conseguindo ler o JSON normalmente. Entretanto, se desejar ter uma visualização mais agradável desses resultados, recomendamos a extensão JSONView, que está disponível no Google Chrome. Com a ajuda dessa extensão, o JSON que vimos acima pode ser exibido da seguinte forma:
Bem melhor, não é mesmo?
Resolvendo problemas com acentuação
Uma outra situação em que as constantes da função json_encode() podem nos ajudar é na questão da acentuação. Para ver esse problema na prática, vamos usar o PHP para realizar uma conexão com o Banco de Dados MySQL e trazer as informações dos cursos a partir deste Banco. Para isso, usaremos o seguinte código:
$connection = new PDO("mysql:dbname=hcode;host=127.0.0.1", "root", "root");
$statement = $connection->prepare('SELECT * FROM courses;');
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);
A estrutura da tabela de cursos está assim:
Perceba que os cursos no Banco de Dados são os mesmos. Apenas adicionamos a expressão “na Prática” ao curso de PHP 7.
Vamos exibir as informações que o PHP nos trouxe do MySQL com este código:
echo json_encode($results);
Quando atualizamos nosso navegador, vemos o seguinte resultado:
Os dados foram exibidos corretamente. Entretanto, como a palavra “Prática” possui um acento, ela foi convertida para um caractere especial. Pode ser que fiquemos incomodados em ver o nome do curso desta forma. Neste caso, podemos usar a constante JSON_UNESCAPED_UNICODE. Nosso código mudará um pouco, e ficará assim:
echo json_encode($results, JSON_UNESCAPED_UNICODE);
Agora o resultado será o seguinte:
Está mais agradável, excelente! Esse com certeza é um dos “truques” mais interessante do PHP ao trabalhar com JSON.
E se desejarmos combinar duas constantes? Por exemplo, levando em conta o último exemplo, como poderíamos converter não apenas os caracteres dos dados, mas também não escapar as barras da URL? Para aplicar mais de uma constante na mesma variável, podemos usar o sinal de | (pipe). O exemplo que acabamos de citar poderia ficar assim:
echo json_encode($results, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
E dessa forma as duas formatações ocorreriam em nosso JSON.
json_decode() - Convertendo uma string JSON em um objeto ou array
Se o json_encode() converte uma variável em JSON, a função json_decode() faz justamente o contrário.
O primeiro parâmetro que ela espera é uma string em JSON. Por padrão, essa função converte o JSON em um objeto. Se desejarmos convertê-lo em um array, basta informar o booleano true como segundo parâmetro.
Para ver essa função “em ação”, vamos continuar usando o último exemplo. A coluna “photos” da nossa tabela de cursos é do tipo JSON, uma novidade do MySQL 8. Inclusive, nós falamos sobre outras novidades desta versão no Hcode Café #19.
Imagine que desejamos exibir todas as fotos dos cursos no navegador. Vamos usar a função json_decode() para isso.
Nosso código ficará assim;
foreach ($results as $row) {
$photos = json_decode($row['photos'], true);
foreach ($photos as $photo) {
echo "<img src=" . $photo . " />";
}
}
Explicando: nós realizamos um foreach() nas informações retornadas pelo Banco de Dados e acessamos os dados de cada um dos cursos. Em seguida nós convertemos apenas a coluna “photos” para um array e armazenamos seu valor na variável $photos. Por fim nós realizamos um novo foreach() nesta variável para exibir cada uma das imagens individualmente por meio de uma tag <img>. O resultado será o seguinte:
Perfeito! Cada uma das imagens foi corretamente exibida no navegador! Imagine em quantas situações essa função pode nos auxiliar.
json_last_error() - Retornando os erros que podem ocorrer
Sabemos que uma das coisas mais comuns na programação são os bugs, e isso também acontece com o JSON. Se houver algum bug, podemos usar a função json_last_error() para descobrir qual problema ocorreu.
Essa função retorna um número inteiro. Podemos dizer que cada um desses números é como um “código” do erro. Eles também podem ser acessados por meio de outras constantes do PHP.
Uma lista completa das possíveis constantes podem ser encontradas na documentação do PHP.
Conclusão
Neste artigo vimos muitas situações em que as funções de JSON podem nos ajudar. Saber manipular essa notação JavaScript é uma habilidade muito necessária para realizar principalmente a comunicação entre servidores.
Se desejar aprender mais sobre JSON no PHP, aplicado em projetos reais, não deixe de fazer nosso Curso Completo de PHP 7.
Esperamos que tenham gostado e até o próximo artigo :)