Travailler avec JSON
Nette\Utils\Json est une classe statique avec des fonctions pour l'encodage et le décodage du format JSON. Elle gère les vulnérabilités des différentes versions de PHP et lance des exceptions en cas d'erreurs.
Installation :
composer require nette/utils
Tous les exemples supposent qu'un alias a été créé :
use Nette\Utils\Json;
Utilisation
encode (mixed $value, bool $pretty=false, bool $asciiSafe=false, bool $htmlSafe=false, bool $forceObjects=false): string
Convertit $value
au format JSON.
Lorsque $pretty
est défini, formate le JSON pour une lecture plus facile et une clarté accrue :
Json::encode($value); // retourne JSON
Json::encode($value, pretty: true); // retourne un JSON plus lisible
Lorsque $asciiSafe
est défini, génère une sortie en ASCII, c'est-à-dire remplace les caractères unicode par
des séquences \uxxxx
:
Json::encode('žluťoučký', asciiSafe: true);
// '"\u017elu\u0165ou\u010dk\u00fd"'
Le paramètre $htmlSafe
assure que la sortie ne contiendra pas de caractères ayant une signification spéciale en
HTML :
Json::encode('one<two & three', htmlSafe: true);
// '"one\u003Ctwo \u0026 three"'
Avec $forceObjects
, même les tableaux avec des clés numériques seront encodés comme des objets
JavaScript :
Json::encode(['a', 'b', 'c']);
// '["a","b","c"]'
Json::encode(['a', 'b', 'c'], forceObjects: true);
// '{"0":"a","1":"b","2":"c"}'
En cas d'erreur, lance une exception Nette\Utils\JsonException
.
try {
$json = Json::encode($value);
} catch (Nette\Utils\JsonException $e) {
// Gestion de l'exception
}
decode (string $json, bool $forceArray=false): mixed
Analyse le JSON en PHP.
Le paramètre $forceArray
force le retour de tableaux au lieu d'objets :
Json::decode('{"variable": true}'); // retourne un objet de type stdClass
Json::decode('{"variable": true}', forceArrays: true); // retourne un tableau
En cas d'erreur, lance une exception Nette\Utils\JsonException
.
try {
$value = Json::decode($json);
} catch (Nette\Utils\JsonException $e) {
// Gestion de l'exception
}
Comment envoyer du JSON depuis un presenter ?
La méthode $this->sendJson($data)
peut être utilisée pour cela, que nous pouvons appeler par exemple dans la
méthode action*()
, voir Envoi de la
réponse.