PHP 8.4.1 Released!

Constantes predefinidas

As contantes abaixo são definidas por esta extensão e só estarão disponíveis quando a extensão tiver sido compilada no PHP ou tiver sido carregada dinamicamente em tempo de execução.

As seguintes constantes indicam o tipo de erro retornado pela função json_last_error() or armazenadas no code de uma JsonException

JSON_ERROR_NONE (int)
Sem erros.
JSON_ERROR_DEPTH (int)
O limite de pilha de chamadas foi ultrapassado
JSON_ERROR_STATE_MISMATCH (int)
Ocorre em underflows ou com incongruência de modos.
JSON_ERROR_CTRL_CHAR (int)
Erro em caracter de controle, possivelmente erro de enconding.
JSON_ERROR_SYNTAX (int)
Erro de sintaxe.
JSON_ERROR_UTF8 (int)
Caracteres UTF-8 mal formados, possivelmente erro de enconding.
JSON_ERROR_RECURSION (int)
O objeto ou array passado para json_encode() inclui referências recursivas, e não pode ser formatada. Se a opção JSON_PARTIAL_OUTPUT_ON_ERROR foi informada, null será substituído no lugar da referência recursiva.
JSON_ERROR_INF_OR_NAN (int)
Um valor passado para json_encode() inclui NAN ou INF. Se a opção JSON_PARTIAL_OUTPUT_ON_ERROR foi informada, 0 será substituído no lugar do número especial.
JSON_ERROR_UNSUPPORTED_TYPE (int)
Um valor de um tipo não suportado foi informado para json_encode(), por exemplo um resource. Se a opção JSON_PARTIAL_OUTPUT_ON_ERROR foi informada, null será substituída ao invés do valor não suportado.
JSON_ERROR_INVALID_PROPERTY_NAME (int)
Uma chave começando com caracter \u0000 estava na chave string foi passada para json_decode() quando decodificando um objeto JSON para um objeto PHP.
JSON_ERROR_UTF16 (int)
Um surrogate UTF-16 despareado em um unicode escape estava presente em uma string JSON processada por json_decode().

As constantes a seguir podem ser combinadas para formar opções na função json_decode().

JSON_BIGINT_AS_STRING (int)
Decodifica inteiros grandes como suas strings originais.
JSON_OBJECT_AS_ARRAY (int)
Decodifica objetos JSON como arrays PHP. Esta opção pode ser adicionada automaticamente quando chamando json_decode() com o segundo parâmetro igual a true.

As seguintes constantes podem ser combinadas para formar opções para a função json_encode().

JSON_HEX_TAG (int)
Todos os caracteres < e > serão convertidos para \u003C and \u003E.
JSON_HEX_AMP (int)
Todos os caracteres & serão convertidos para \u0026.
JSON_HEX_APOS (int)
Todos os caracteres ' serão convertidos para \u0027.
JSON_HEX_QUOT (int)
Todos os caracteres " serão convertidos para \u0022.
JSON_FORCE_OBJECT (int)
Imprime um objeto em vez de um array quando um array não recursivo é usado. Muito útil quando o chamador espera um objeto mas o array está vazio.
JSON_NUMERIC_CHECK (int)
Codifica strings numéricas como números.
JSON_PRETTY_PRINT (int)
Formata os dados retornados com espaços em branco.
JSON_UNESCAPED_SLASHES (int)
Não escapa o caracter /.
JSON_UNESCAPED_UNICODE (int)
Codifica caracteres Unicode multibyte literalmente (default é formatar como \uXXXX).
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
Substitui valores não identificados ao invés de falhar.
JSON_PRESERVE_ZERO_FRACTION (int)
Garante que float sempre são codificados como um número float.
JSON_UNESCAPED_LINE_TERMINATORS (int)
Os fins de linha são preservados não escapados quando JSON_UNESCAPED_UNICODE é informado. Este é o mesmo comportamento existente anteriormente ao PHP 7.1 sem essa constante. Disponível desde o PHP 7.1.0.

As constantes a seguir podem ser combinadas para formar opções para a função json_decode() e json_encode().

JSON_INVALID_UTF8_IGNORE (int)
Ignora caracteres inválidos UTF-8. Disponível desde o 7.2.0.
JSON_INVALID_UTF8_SUBSTITUTE (int)
Converte caracteres inválidos UTF-8 para \0xfffd (Caracter Unicode 'REPLACEMENT CHARACTER') Disponível desde o 7.2.0.
JSON_THROW_ON_ERROR (int)
Lança um JsonException se ocorrer um erro ao invés de carregar o erro global que pode ser obtido com json_last_error() e json_last_error_msg(). JSON_PARTIAL_OUTPUT_ON_ERROR tem precedência sobre JSON_THROW_ON_ERROR. Disponível desde o PHP 7.3.0.
JSON_ERROR_NON_BACKED_ENUM (int)
O valor passado para json_encode() inclui uma enumeração não apoiada que não pode ser serializada. Disponível a partir do PHP 8.1.0.
adicione uma nota

Notas Enviadas por Usuários (em inglês) 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