PHP 8.4.1 Released!

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 siguientes constantes indican el tipo de error retornado por json_last_error().

JSON_ERROR_NONE (integer)
No ha ocurrido ningún error.
JSON_ERROR_DEPTH (integer)
Se ha excedido la profundidad máxima de la pila.
JSON_ERROR_STATE_MISMATCH (integer)
Por desbordamiento de buffer o cuando los modos no coinciden.
JSON_ERROR_CTRL_CHAR (integer)
Error del carácter de control, posiblemente se ha codificado de forma incorrecta.
JSON_ERROR_SYNTAX (integer)
Error de sintaxis.
JSON_ERROR_UTF8 (integer)
Caracteres UTF-8 mal formados, posiblemente codificados incorrectamente.
JSON_ERROR_RECURSION (integer)

El objeto o array pasado a json_encode() incluye referencias recursivas y no se puede codificar. Si se proporcionó la opción JSON_PARTIAL_OUTPUT_ON_ERROR, se codificará null en el lugar de la referencia recursiva.

JSON_ERROR_INF_OR_NAN (integer)

El valor pasado a json_encode() incluye NAN o INF. Si se proporcionó la opción JSON_PARTIAL_OUTPUT_ON_ERROR, se codificará 0 en el lugar de estos números especiales.

JSON_ERROR_UNSUPPORTED_TYPE (integer)

Se proporcionó un valor de un tipo no admitido para json_encode(), tal como un resource. Si se proporcionó la opción JSON_PARTIAL_OUTPUT_ON_ERROR, se codificará null en el lugar del valor no admitido.

JSON_ERROR_INVALID_PROPERTY_NAME (integer)

Se ha usado una clave que empieza con el caracter \u0000 en la cadena de texto pasada a json_encode() al decodificar un objeto JSON en un objeto PHP.

JSON_ERROR_UTF16 (integer)

Un único sustituto UTF-16 no emparejado en una secuencia de escape unicode contenida en la cadena JSON pasada a json_encode().

Las siguientes constantes se pueden combinar para obtener opciones para json_encode().

JSON_HEX_TAG (integer)
Todos los < y > se convierten a \u003C y \u003E.
JSON_HEX_AMP (integer)
Todos los & se convierten a \u0026.
JSON_HEX_APOS (integer)
Todas las ' se convierten a \u0027.
JSON_HEX_QUOT (integer)
Todas las " se convierten a \u0022.
JSON_FORCE_OBJECT (integer)
Devuelve un objeto en vez de un array cuando se usa un array no asociativo. Especialmente útil cuando el destinatario del resultado espera un objeto y el array está vacío.
JSON_NUMERIC_CHECK (integer)
Codifica textos numéricos como números.
JSON_BIGINT_AS_STRING (integer)
Codifica integer grandes como su valor del string original.
JSON_OBJECT_AS_ARRAY (integer)
Decodifica objetos JSON como arrays de PHP. Esta opción se puede añadir automáticamente llamando a json_decode() con el segundo parámetro igual a true
JSON_PRETTY_PRINT (integer)
Utiliza espacios en blanco para formatear los datos devueltos.
JSON_UNESCAPED_SLASHES (integer)
No escapar /.
JSON_UNESCAPED_UNICODE (integer)
Codificar caracteres Unicode multibyte literalmente (por defecto es escapado como \uXXXX).
JSON_PARTIAL_OUTPUT_ON_ERROR (integer)
Sustituir algunos valores no codificables en lugar de fallar.
JSON_PRESERVE_ZERO_FRACTION (integer)
Se asegura de que los valores float son siempre codificados como valores de punto flotante.
JSON_UNESCAPED_LINE_TERMINATORS (int)
La finalización de línea se mantienen sin escapar cuando se indica JSON_UNESCAPED_UNICODE. Utiliza el mismo comportamiento que tenía antes de PHP 7.1 sin esta constante. Disponible desde PHP 7.1.0.

Las siguientes constantes pueden combinarse para formar opciones para json_decode() y json_encode().

JSON_INVALID_UTF8_IGNORE (int)
Ignorar caracteres UTF-8 inválidos. Disponible desde PHP 7.2.0.
JSON_INVALID_UTF8_SUBSTITUTE (int)
Convertir caracteres UTF-8 inválidos a \0xfffd (Carácter Unicode 'CARÁCTER DE SUSTITUCIÓN') Disponible desde PHP 7.2.0.
JSON_THROW_ON_ERROR (int)
Lanza JsonException si ocurre un error en lugar de establecer el estado global de error que se recupera con json_last_error() y json_last_error_msg(). JSON_PARTIAL_OUTPUT_ON_ERROR tiene prioridad sobre JSON_THROW_ON_ERROR. Disponible desde PHP 7.3.0.
JSON_ERROR_NON_BACKED_ENUM (int)
El valor pasado a json_encode() incluye un enum no respaldado que no se puede serializar. Disponible desde PHP 8.1.0.
add a note

User Contributed Notes 6 notes

up
91
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
67
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
28
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
17
ASchmidt at Anamera dot net
6 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
0
eduard dot amoros dot wahl at gmail dot com
1 month 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
-4
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