(PECL simdjson >= 2.0.0)
simdjson_decode — Décode une chaîne JSON
Prend une chaîne encodée en JSON et la convertit en une valeur PHP. Cela utilise une Instruction Simultanée plus Rapide, Données Multiples (Simultaneous Instruction, Multiple Data - SIMD) que json_decode() lorsqu'elle est prise en charge par l'architecture de l'ordinateur.
json
Le string json
à décoder.
Cette fonction ne fonctionne qu'avec des chaînes encodées en UTF-8.
Cette fonction analyse les entrées valides que json_decode() peut décoder, à condition qu'elles soient inférieures à 4 Go de longueur.
associative
Lorsque true
, les objets JSON seront retournés sous forme
de tableau associatifs ; lorsqu'ils sont false
, les objets JSON seront retournés sous forme d'objets.
depth
La profondeur maximale de la structure à décoder.
La valeur doit être supérieure à 0
,
et inférieure ou égale à 2147483647
.
Ceux qui appellent cette fonction devraient utiliser des valeurs raisonnablement petites,
car des profondeurs plus importantes nécessitent plus d'espace tampon et augmenteront
la profondeur de récursion, contrairement à l'implémentation actuelle de json_decode().
Renvoie la valeur encodée dans json
dans le
type PHP approprié. Les valeurs true
, false
et
null
sont renvoyées respectivement comme true
, false
et null
.
Si json
est invalide, une SimdJsonException est lancée à partir de PECL simdjson 2.1.0,
alors qu'auparavant, une RuntimeException était lancée.
Si depth
est en dehors de la plage autorisée,
une SimdJsonValueError est lancée à partir de PECL simdjson 3.0.0,
alors qu'auparavant, une erreur de niveau E_WARNING
était lancée.
Exemple #1 Exemples de simdjson_decode()
<?php
$json = '{"a":1,"b":2,"c":3}';
var_dump(simdjson_decode($json));
var_dump(simdjson_decode($json, true));
?>
L'exemple ci-dessus va afficher :
object(stdClass)#1 (3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) }
Exemple #2 Accéder à des propriétés d'objet non valides
Accéder à des éléments dans un objet qui contiennent des caractères non autorisés par la convention de nommage de PHP (par exemple, le trait d'union) peut être accompli en encapsulant le nom de l'élément entre des accolades et des apostrophes.
<?php
$json = '{"foo-bar": 12345}';
$obj = simdjson_decode($json);
print $obj->{'foo-bar'}; // 12345
?>
Exemple #3 Erreurs courantes lors de l'utilisation de simdjson_decode()
<?php
// les chaînes suivantes sont valides en JavaScript mais pas en JSON
// le nom et la valeur doivent être encadrés de guillemets doubles
// les guillemets simples ne sont pas valides
$bad_json = "{ 'bar': 'baz' }";
simdjson_decode($bad_json); // Throws SimdJsonException
// le nom doit être encadré de guillemets doubles
$bad_json = '{ bar: "baz" }';
simdjson_decode($bad_json); // Throws SimdJsonException
// les virgules de fin ne sont pas autorisées
$bad_json = '{ bar: "baz", }';
simdjson_decode($bad_json); // Throws SimdJsonException
?>
Exemple #4 Erreurs de depth
<?php
// Encoder des données avec une profondeur maximale de 4
// (array -> array -> array -> string)
$json = json_encode(
[
1 => [
'English' => [
'One',
'January'
],
'French' => [
'Une',
'Janvier'
]
]
]
);
// Afficher les erreurs pour différentes profondeurs.
var_dump(simdjson_decode($json, true, 4));
try {
var_dump(simdjson_decode($json, true, 3));
} catch (SimdJsonException $e) {
echo "Caught: ", $e->getMessage(), "\n";
}
?>
L'exemple ci-dessus va afficher :
array(1) { [1]=> array(2) { ["English"]=> array(2) { [0]=> string(3) "One" [1]=> string(7) "January" } ["French"]=> array(2) { [0]=> string(3) "Une" [1]=> string(7) "Janvier" } } } Caught: The JSON document was too deep (too many nested objects and arrays)
Exemple #5 simdjson_decode() de grands entiers
<?php
$json = '{"number": 12345678901234567890}';
var_dump(simdjson_decode($json));
?>
L'exemple ci-dessus va afficher :
object(stdClass)#1 (1) { ["number"]=> float(1.2345678901235E+19) }
Note:
La spécification JSON n'est pas JavaScript, mais un sous-ensemble de JavaScript.
Note:
Dans le cas où le décodage échoue, une SimdJsonException est lancée et SimdJsonException::getCode() et SimdJsonException::getMessage() peuvent être utilisés pour déterminer la nature exacte de l'erreur.