Constantes predefinidas

Estas constantes están definidas por esta extensión y estarán disponibles sólo cuando la extensión haya sido compilada con PHP, o bien sea cargada dinámicamente en ejecución.

Las constantes siguientes indican el tipo de error devuelto por json_last_error() o almacenado como code de una JsonException.

JSON_ERROR_NONE (int)
No se ha producido ningún error.
JSON_ERROR_DEPTH (int)
Se ha alcanzado la profundidad máxima de la pila.
JSON_ERROR_STATE_MISMATCH (int)
Ocurre con un underflow o con una inadaptación de los modos.
JSON_ERROR_CTRL_CHAR (int)
Error al controlar los caracteres, probablemente codificados incorrectamente.
JSON_ERROR_SYNTAX (int)
Error de sintaxis.
JSON_ERROR_UTF8 (int)
Caracteres UTF-8 mal formados, probablemente codificados incorrectamente.
JSON_ERROR_RECURSION (int)
El objeto o el array pasado a la función json_encode() incluye referencias recursivas y no pueden ser codificadas. Si se ha proporcionado la opción JSON_PARTIAL_OUTPUT_ON_ERROR, null será codificado en lugar de la referencia recursiva.
JSON_ERROR_INF_OR_NAN (int)
El valor pasado a la función json_encode() incluye NAN, o INF. Si se ha proporcionado la opción JSON_PARTIAL_OUTPUT_ON_ERROR, 0 será codificado en lugar de estos números especiales.
JSON_ERROR_UNSUPPORTED_TYPE (int)
Se ha proporcionado un valor de un tipo no soportado a la función json_encode(), como por ejemplo una recurso. Si se ha proporcionado la opción JSON_PARTIAL_OUTPUT_ON_ERROR, null será codificado en lugar del valor no soportado.
JSON_ERROR_INVALID_PROPERTY_NAME (int)
Una clave que comienza con el carácter \u0000 estaba presente en la cadena de caracteres pasada a json_decode() durante la decodificación de un objeto JSON en un objeto PHP.
JSON_ERROR_UTF16 (int)
Sustituto UTF-16 simple no apareado en el escape unicode contenido en la cadena de caracteres JSON pasada a json_decode().
JSON_ERROR_NON_BACKED_ENUM (int)
El valor pasado a json_encode() incluye una enumeración no soportada que no puede ser serializada. Disponible a partir de PHP 8.1.0.

Las constantes siguientes pueden ser combinadas para formar las opciones de json_decode().

JSON_BIGINT_AS_STRING (int)
Decodifica los enteros grandes como una cadena de caracteres.
JSON_OBJECT_AS_ARRAY (int)
Decodifica un objeto JSON en array PHP. Esta opción puede ser añadida automáticamente llamando a json_decode() con el segundo argumento igual a true.

Las constantes siguientes pueden ser combinadas para formar las opciones de json_encode().

JSON_HEX_TAG (int)
Todos los caracteres < y > son convertidos en secuencias \u003C y \u003E.
JSON_HEX_AMP (int)
Todos los caracteres & son convertidos en \u0026.
JSON_HEX_APOS (int)
Todos los apóstrofes ' son convertidos en \u0027.
JSON_HEX_QUOT (int)
Todas las comillas dobles " son convertidas en \u0022.
JSON_FORCE_OBJECT (int)
Produce un objeto en lugar de un array, cuando se utiliza un array no asociativo. Esto es especialmente útil cuando el destinatario del resultado espera un objeto, y el array está vacío.
JSON_NUMERIC_CHECK (int)
Codifica las cadenas numéricas como números.
JSON_PRETTY_PRINT (int)
Utiliza espacios en los datos devueltos para formatearlos.
JSON_UNESCAPED_SLASHES (int)
No escapar los caracteres /.
JSON_UNESCAPED_UNICODE (int)
Codifica los caracteres multioctetos Unicode literalmente (el comportamiento por defecto es escaparles con \uXXXX).
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
Sustituye ciertos valores no codificables en lugar de fallar.
JSON_PRESERVE_ZERO_FRACTION (int)
Asegura que los valores de tipo float siempre sean codificados como valor flotante.
JSON_UNESCAPED_LINE_TERMINATORS (int)
Los terminadores de línea son conservados sin escapar cuando JSON_UNESCAPED_UNICODE es proporcionado. Utiliza el mismo comportamiento como si fuera antes de PHP 7.1 sin esta constante. Disponible a partir de PHP 7.1.0.

Las constantes siguientes pueden ser combinadas para formar las opciones de json_decode() y json_encode().

JSON_INVALID_UTF8_IGNORE (int)
Ignora los caracteres UTF-8 inválidos. Disponible a partir de PHP 7.2.0.
JSON_INVALID_UTF8_SUBSTITUTE (int)
Convierte los caracteres UTF-8 inválidos en \0xfffd (Carácter Unicode 'REPLACEMENT CHARACTER'). Disponible a partir de PHP 7.2.0.
JSON_THROW_ON_ERROR (int)
Emite una JsonException si ocurre un error en lugar de establecer el estado de error global que es recuperado mediante json_last_error() y json_last_error_msg(). JSON_PARTIAL_OUTPUT_ON_ERROR tiene prioridad sobre JSON_THROW_ON_ERROR. Disponible a partir de PHP 7.3.0.
add a note

User Contributed Notes 6 notes

up
82
majid4466 at gmail dot com
8 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
68
Yzmir Ramirez
10 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
34
nikospapoutsis
2 years 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
14
ASchmidt at Anamera dot net
7 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
1
eduard dot amoros dot wahl at gmail dot com
9 months ago
Warning about JSON_NUMERIC_CHECK and scientific notation.

JSON_NUMERIC_CHECK will remove scientific notation. Thus,
json_encode(['scientificNumber' => '1e-4'], JSON_NUMERIC_CHECK);
will return {"scientificNumber":0.0001}

You have to account for this, as it may defeat the whole purpose of scientific notation.
up
-2
Anonymous
6 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
To Top