PHP i JSON
JSON i PHP: Intercanvi de dades segur i universal
JSON (JavaScript Object Notation) és un format de text lleuger i independent del llenguatge que s'utilitza principalment per a l'intercanvi de dades entre un servidor (com un backend PHP) i un client (com un navegador web o una aplicació mòbil).
JSON es basa en dos principis bàsics:
-
Parells Nom/Valor (Objectes en JSON, que es mapegen a arrays associatius o objectes a PHP).
-
Llistes Ordenades de Valors (Arrays en JSON, que es mapegen a arrays indexats a PHP).
Com que JSON és simplement una cadena de text, pot ser enviat fàcilment a través de les peticions i respostes HTTP, convertint-se en l'estàndard de facto per a les API REST.
Funcions PHP per a JSON
PHP proporciona dues funcions integrades essencials per a la conversió entre els tipus de dades de PHP i el format JSON:
-
json_encode(): Serialitza (converteix) dades de PHP a una cadena JSON. -
json_decode(): Deserialitza (converteix) una cadena JSON a dades de PHP.
Referència Oficial
Podeu trobar la documentació completa a la secció de JSON de PHP.net: https://www.php.net/manual/en/book.json.php
json_encode(): PHP => JSON
La funció json_encode() pren una variable de PHP (un array, un objecte, o un escalar) i retorna la seva representació com a cadena JSON. Aquesta és la funció que utilitzeu just abans d'enviar una resposta de dades al client.
Sintaxi
string|false json_encode ( mixed $value, int $flags = 0, int $depth = 512 )
Exemple: Array associatiu (JSON Object)
Quan codifiqueu un array associatiu de PHP, el resultat és un objecte JSON.
<?php
// PHP: Array Associatiu
$producte = [
"nom" => "Ordinador Portàtil",
"preu" => 1250.00,
"disponible" => true
];
// Conversió a JSON
$json_string = json_encode($producte);
echo $json_string;
// Sortida: {"nom":"Ordinador Portàtil","preu":1250,"disponible":true}
Exemple: Array indexat (JSON Array)
Quan codifiqueu un array de PHP amb índexs numèrics consecutius (des del 0), el resultat és un array JSON.
<?php
// PHP: Array Indexat
$colors_primaris = ["vermell", "verd", "blau"];
// Conversió a JSON
$json_string = json_encode($colors_primaris);
echo $json_string;
// Sortida: ["vermell","verd","blau"]
$flags per millorar (Recomanat)
El segon paràmetre $flags permet aplicar opcions de formatació i seguretat. Dues de les més útils són:
| Constant | Descripció |
JSON_PRETTY_PRINT |
Formata el JSON amb salts de línia i indentació, fent-lo llegible per humans (ideal per a depuració). |
JSON_UNESCAPED_UNICODE |
Evita que els caràcters Unicode (com accents o caràcters especials) es codifiquin com a \uXXXX (recomanat per a idiomes com el català). |
<?php
$array_exemple = [
"títol" => "Document Català",
"descripció" => "Amb àccents"
];
// JSON codificat amb format llegible i sense escapar caràcters Unicode
echo json_encode($array_exemple, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
json_decode(): JSON => PHP
La funció json_decode() pren una cadena JSON i la converteix en variables natives de PHP, permetent processar les dades al servidor.
Sintaxi
mixed|null json_decode ( string $json, bool $associative = false, int $depth = 512, int $flags = 0 )
El paràmetre $associative és el més important.
Exemple: Decodificació a objecte PHP (Default)
Si s'omet el segon paràmetre ($associative = false per defecte), els objectes JSON es converteixen en Objectes PHP estàndard (stdClass).
<?php
$json_obj = '{"nom":"Taula","quantitat":10}';
// Descodificació a Objecte PHP
$dades = json_decode($json_obj);
// Accés a les dades com a propietats d'objecte:
echo "Nom: " . $dades->nom . "\n";
// Sortida: Nom: Taula
var_dump($dades);
/* Sortida:
object(stdClass)#1 (2) {
["nom"]=> string(5) "Taula"
["quantitat"]=> int(10)
}
*/
Exemple: Decodificació a array associatiu (Recomanat)
Si es passa true com a segon paràmetre ($associative = true), els objectes JSON es converteixen en Arrays Associatius de PHP. Aquesta és la forma més habitual i convenient per manipular les dades.
<?php
$json_obj = '{"nom":"Taula","quantitat":10}';
// Descodificació a Array Associatiu
$dades = json_decode($json_obj, true);
// Accés a les dades com a elements d'array:
echo "Quantitat: " . $dades['quantitat'] . "\n";
// Sortida: Quantitat: 10
var_dump($dades);
/* Sortida:
array(2) {
["nom"]=> string(5) "Taula"
["quantitat"]=> int(10)
}
*/
Errors de JSON
La funció json_decode() retorna null (o false en PHP 8.0+ amb certs errors) si la cadena JSON no és vàlida. Després d'una crida a json_decode(), és crucial comprovar si hi ha errors per depurar problemes de format:
<?php
$json_malformat = '{"nom":"Dada Malalta"'; // Falta tancar clau }
json_decode($json_malformat);
if (json_last_error() !== JSON_ERROR_NONE) {
// La funció json_last_error_msg() retorna el missatge d'error llegible
echo "Error de JSON: " . json_last_error_msg();
// Sortida: Error de JSON: Syntax error
}
Accés als Valors Descodificats
Quan utilitzeu json_decode(), podeu triar entre dos formats de sortida per al JSON Objecte:
Opció 1: Descodificació a objecte PHP standard (stdClass)
Per defecte (json_decode($jsonobj, false) o ometent el segon paràmetre), els objectes JSON es converteixen en Objectes PHP de tipus stdClass. L'accés es realitza mitjançant la notació de fletxa (->).
| Format JSON | Equivalència PHP | Mètode d'Accés |
Objecte { "clau": valor } |
Objecte $obj |
$obj->clau |
Exemple d'Accés a Objecte:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$dades = json_decode($jsonobj); // El segon paràmetre és false per defecte (Objecte)
echo "L'edat de Peter és: " . $dades->Peter . "\n";
echo "L'edat de Joe és: " . $dades->Joe . "\n";
Opció 2: Decodificació a array associatiu
Si configureu el segon paràmetre a true (json_decode($jsonobj, true)), els objectes JSON es converteixen en Arrays Associatius de PHP. Aquesta és la forma preferida per molts desenvolupadors de PHP, ja que els arrays són més versàtils. L'accés es realitza mitjançant la notació de claudàtors i clau entre cometes (['clau']).
| Format JSON | Equivalència PHP | Mètode d'Accés |
Objecte { "clau": valor } |
Array Associatiu $arr |
$arr['clau'] |
Exemple d'Accés a array associatiu:
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$dades = json_decode($jsonobj, true); // El segon paràmetre és true (Array Associatiu)
echo "L'edat de Peter és: " . $dades["Peter"] . "\n";
echo "L'edat de Joe és: " . $dades["Joe"] . "\n";
Iteració (Recorregut) dels Valors
El bucle foreach funciona tant amb objectes PHP estàndard com amb arrays associatius, permetent recórrer fàcilment tots els parells clau-valor.
Iteració sobre Objecte PHP
Quan el JSON es descodifica a un objecte, el foreach itera sobre les propietats públiques d'aquest objecte.
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$dades = json_decode($jsonobj); // Descodificat com a Objecte
echo "<h3>Iteració sobre Objecte:</h3>";
foreach($dades as $clau => $valor) {
// Accedim directament a les propietats
echo $clau . " té " . $valor . " anys.<br>";
}
Iteració sobre array associatiu
Si utilitzeu l'opció d'Array Associatiu, el codi d'iteració és idèntic i sovint més senzill de manejar en estructures de dades complexes (JSON anidat).
<?php
$jsonobj = '{"Peter":35,"Ben":37,"Joe":43}';
$dades = json_decode($jsonobj, true); // Descodificat com a Array Associatiu
echo "<h3>Iteració sobre Array Associatiu:</h3>";
foreach($dades as $clau => $valor) {
// Accedim als elements de l'array
echo $clau . " té " . $valor . " anys.<br>";
}