CakeFest 2024: The Official CakePHP Conference

Constantes pré-définies

Ces constantes sont définies par cette extension, et ne sont disponibles que si cette extension a été compilée avec PHP, ou bien chargée au moment de l'exécution.

Les constantes suivantes indiquent le type d'erreur retournée par json_last_error() ou stockée en tant que code d'une JsonException.

JSON_ERROR_NONE (int)
Aucune erreur n'est survenue.
JSON_ERROR_DEPTH (int)
La profondeur maximale de la pile a été atteinte.
JSON_ERROR_STATE_MISMATCH (int)
Survient avec un underflow ou avec une inadéquation des modes.
JSON_ERROR_CTRL_CHAR (int)
Erreur lors du contrôle des caractères, probablement encodé incorrectement.
JSON_ERROR_SYNTAX (int)
Erreur de syntaxe.
JSON_ERROR_UTF8 (int)
Caractères UTF-8 mal formés, probablement encodé incorrectement.
JSON_ERROR_RECURSION (int)
L'objet ou le tableau passé à la fonction json_encode() inclut les références récursives et ne peuvent être encodées. Si l'option JSON_PARTIAL_OUTPUT_ON_ERROR a été fournie, null sera encodé à la place de la référence récursive.
JSON_ERROR_INF_OR_NAN (int)
La valeur passée à la fonction json_encode() inclut soit NAN, soit INF. Si l'option JSON_PARTIAL_OUTPUT_ON_ERROR a été fournie, 0 sera encodé à la place de ces nombres spéciaux.
JSON_ERROR_UNSUPPORTED_TYPE (int)
Une valeur d'un type non supporté a été fournie à la fonction json_encode(), comme par exemple une ressource. Si l'option JSON_PARTIAL_OUTPUT_ON_ERROR a été fournie, null sera encodé à la place de la valeur non supportée.
JSON_ERROR_INVALID_PROPERTY_NAME (int)
Une clé commençant avec le caractère \u0000 était présent dans la chaîne de caractères passé à json_decode() lors d'un décodage d'un object JSON en un object PHP.
JSON_ERROR_UTF16 (int)
Substitut UTF-16 simple non apparié dans l'échappement unicode contenue dans la chaîne de caractères JSON passé à json_decode().

Les constantes suivantes peuvent être combinées pour former les options de json_decode().

JSON_BIGINT_AS_STRING (int)
Décode les gros entiers sous forme d'une chaîne de caractères.
JSON_OBJECT_AS_ARRAY (int)
Décode un object JSON en tableau PHP. Cette option peut être ajouté automatiquement en appelant json_decode() avec le deuxième paramètre égal à true.

Les constantes suivantes peuvent être combinées pour former les options de json_encode().

JSON_HEX_TAG (int)
Tous les caractères < et > sont convertis en séquences \u003C et \u003E.
JSON_HEX_AMP (int)
Tous les caractères & sont convertis en \u0026.
JSON_HEX_APOS (int)
Tous les guillemets ' sont convertis en \u0027.
JSON_HEX_QUOT (int)
Tous les guillemets doubles " sont convertis en \u0022.
JSON_FORCE_OBJECT (int)
Produit un objet plutôt qu'un tableau, lorsqu'un tableau non-associatif est utilisé. C'est particulièrement utile lorsque le destinataire du résultat attend un objet, et que le tableau est vide.
JSON_NUMERIC_CHECK (int)
Encode les chaînes numériques en tant que nombres.
JSON_PRETTY_PRINT (int)
Utilise des espaces dans les données retournées pour les formater.
JSON_UNESCAPED_SLASHES (int)
Ne pas échapper les caractères /.
JSON_UNESCAPED_UNICODE (int)
Encode les caractères multioctets Unicode littéralement (le comportement par défaut est de les échapper par \uXXXX).
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
Substitue certaines valeurs non encodable au lieu d'échouer.
JSON_PRESERVE_ZERO_FRACTION (int)
S'assure que les valeurs de type nombre décimal sont toujours encodées comme valeur flottante.
JSON_UNESCAPED_LINE_TERMINATORS (int)
Les terminateurs de ligne sont conservés sans être échappés quand JSON_UNESCAPED_UNICODE est fourni. Il utilise le même comportement comme si c'était avant PHP 7.1 sans cette constante. Disponible à partir de PHP 7.1.0.

Les constantes suivantes peuvent être combinées pour former les options de json_decode() et json_encode().

JSON_INVALID_UTF8_IGNORE (int)
Ignore les caractères UTF-8 invalide. Disponible à partir de PHP 7.2.0.
JSON_INVALID_UTF8_SUBSTITUTE (int)
Convertit les caractères UTF-8 invalide en \0xfffd (Caractère Unicode 'REPLACEMENT CHARACTER'). Disponible à partir de PHP 7.2.0.
JSON_THROW_ON_ERROR (int)
Émet une JsonException si une erreur se produit au lieu de régler l'état d'erreur globale qui est récupéré grâce à json_last_error() et json_last_error_msg(). JSON_PARTIAL_OUTPUT_ON_ERROR prend la priorité par rapport à JSON_THROW_ON_ERROR. Disponible à partir de PHP 7.3.0.
add a note

User Contributed Notes 7 notes

up
85
majid4466 at gmail dot com
7 years ago
To get a really clean json string use these three constants like so:

<?php
$array
= ['€', 'http://example.com/some/cool/page', '337'];
$bad = json_encode($array);
$good = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

// $bad would be ["\u20ac","http:\/\/example.com\/some\/cool\/page","337"]
// $good would be ["€","http://example.com/some/cool/page",337]
?>
up
26
nikospapoutsis
1 year ago
Be EXTREMELY cautious when using the code majid4466 at gmail dot com provided, or JSON_NUMERIC_CHECK in general.

For example, in php 7.4 and 8.1 with precision: 14 and serialize_precision: -1 we get:

<?php
$array
= ['€', 55.6666666666666666, 'http://example.com/some/cool/page', '000337', '55.6666666666666666'];
echo
$case1 = json_encode($array);
echo
$case2 = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
echo
$case3 = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

[
"\u20ac",55.666666666666664,"http:\/\/example.com\/some\/cool\/page","000337","55.6666666666666666"]
// in $case1, both euro sign and the url change but we also lost a digit in our unquoted float (due to precision)

["€",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// in $case2, both euro sign and the url stay exactly the same but we still lost a digit in our unquoted float (due to precision)

["€",55.666666666666664,"http://example.com/some/cool/page",337,55.666666666666664]
// in $case3, we once again keep euro sign and the url intact but this time not only our unquoted float lost a digit
// but the same happened to our quoted float and the number/string lost its leading zeros too

Also, note that in php 5.x you will probably get some different but equally wrong results as default values may be different and some functions have changed internally as well.
up
66
Yzmir Ramirez
9 years ago
If you curious of the numeric values of the constants, as of JSON 1.2.1, the constants have the following values (not that you should use the numbers directly):

JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256

JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3

JSON_ERROR_SYNTAX => 4

JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1

JSON_BIGINT_AS_STRING => 2
up
15
ASchmidt at Anamera dot net
5 years ago
In a multi-level array, JSON_FORCE_OBJECT will encode ALL nested numeric arrays as objects.

If your concern was ONLY the first-level array (e.g., to make it suitable as a MySQL JSON column), you could just cast your first-level array to object, e.g.:

<?php
$json
= json_encode( (object) $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Or, if you have large arrays and are concerned about the overhead of object casting, you could append a "null" value beyond the size of the array, which will force the array to become associative:

<?php
$beyond
= count( $array ) + 1;
if ( !
array_key_exists( $beyond, $array) )
$array[ $beyond ] = NULL;
$json = json_encode( $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Of course, your later code has to treat an element with a "NULL" value the same as "!isset()", if it iterates the array.
up
-2
Anonymous
5 years ago
flags JSON_NUMERIC_CHECK and JSON_PRESERVE_ZERO_FRACTION are broken in php 7+ — json_encode((float)8.8) returns "8.8000000000000007", and json_encode((float)8.8, JSON_NUMERIC_CHECK) and json_encode((float)8.8, JSON_PRESERVE_ZERO_FRACTION) return "8.8000000000000007" too.

the only way to fix this is setting "serialize_precision = -1" in php.ini
up
-2
JuanP
8 years ago
Updated format values list:

JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256
JSON_PARTIAL_OUTPUT_ON_ERROR => 512
JSON_PRESERVE_ZERO_FRACTION => 1024
up
-33
on5wis at mac dot com
8 years ago
since json_encode expects a UTF-8 string there is no need to encode the € symbol.

I suggest you try to echo : json_encode('€');
It gives: "\u20ac"
I'm running PHP 5.6.5 on the CLI, on MacOS X 10.10
To Top