Introdução: por que o PHP precisa de JSON?
JSON (JavaScript Object Notation) é um formato leve de intercâmbio de dados que se tornou o padrão de facto para APIs web, arquivos de configuração e armazenamento de informações estruturadas. Apesar de sua origem no JavaScript, o JSON é perfeitamente suportado em todas as linguagens de programação modernas, incluindo o PHP.
No PHP, trabalhar com JSON é implementado nativamente por meio de duas funções principais: json_encode() (serialização — conversão de dados PHP em uma string JSON) e json_decode() (desserialização — análise de uma string JSON de volta para estruturas PHP). Neste artigo, examinaremos detalhadamente como usar essas ferramentas de forma eficaz, tratar erros e aplicar JSON em projetos reais.
1. Serialização de dados: a função json_encode()
A função json_encode() converte um valor PHP (array, objeto, string, número) em uma string no formato JSON. Isso é necessário quando você deseja enviar dados para um cliente (por exemplo, via AJAX) ou salvá-los em um arquivo.
Sintaxe básica e exemplos
<?php// Array simples$colors = ["red", "green", "blue"];echo json_encode($colors);// Saída: ["red","green","blue"]
// Array associativo$user = [ "name" => "Ivan", "age" => 30, "is_admin" => false];echo json_encode($user);// Saída: {"name":"Ivan","age":30,"is_admin":false}?>Flags úteis do json_encode()
A função suporta um segundo parâmetro — uma máscara de bits de flags. Vamos ver as mais úteis:
JSON_PRETTY_PRINT— formata a saída com indentação para legibilidade.JSON_UNESCAPED_UNICODE— não escapa caracteres cirílicos e outros Unicode (caso contrário, letras russas se transformam em \\uXXXX).JSON_NUMERIC_CHECK— converte strings que contêm números em tipo numérico.JSON_FORCE_OBJECT— força a transformação de um array em objeto, mesmo para arrays indexados.
<?php$data = ["name" => "Anna", "age" => "25"];
// Sem flagsecho json_encode($data);// {"name":"\\u0410\\u043d\\u043d\\u0430","age":"25"}
// Com flagsecho json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);/*{ "name": "Anna", "age": "25"}*/?>2. Análise de JSON: a função json_decode()
A função json_decode() realiza a operação inversa — transforma uma string JSON de volta em uma variável PHP. Por padrão, ela retorna um objeto da classe stdClass, mas você pode solicitar um array associativo.
Análise em objeto e em array
<?php$jsonString = '{"name":"Peter","age":28,"skills":["PHP","MySQL"]}';
// Padrão — objeto$obj = json_decode($jsonString);echo $obj->name; // Peterecho $obj->skills[0]; // PHP
// Com a flag true — array associativo$arr = json_decode($jsonString, true);echo $arr["name"]; // Peterecho $arr["skills"][1]; // MySQL?>Profundidade de recursão
O terceiro parâmetro depth limita a profundidade de aninhamento. O padrão é 512 níveis. Isso é uma proteção contra ataques do tipo "billion laughs":
<?php$malicious = '{"a":{"b":{"c":"d"}}}';$result = json_decode($malicious, false, 2); // Máximo 2 níveis// Retornará null porque a profundidade foi excedida?>3. Tratamento de erros ao trabalhar com JSON
Um dos problemas mais comuns é uma string JSON inválida. O PHP não lança uma exceção em caso de erro de análise, mas retorna null. Para entender o que deu errado, use as funções json_last_error() e json_last_error_msg().
Verificação de erros
<?php$badJson = '{"name": "Error, missing quote}';$data = json_decode($badJson);
if (json_last_error() !== JSON_ERROR_NONE) { echo "Erro JSON: " . json_last_error_msg();}?>