International PHP Conference Munich 2025

Предопределённые константы

Модуль определяет следующие константы и открывает доступ к ним только тогда, когда модуль либо собрали в PHP, либо динамически загрузили при выполнении кода.

Следующие константы указывают на тип ошибки, которую возвращает функция json_last_error() или которая хранится в свойстве code объекта исключения JsonException.

JSON_ERROR_NONE (int)
Процедура кодирования или декодирования завершилась без ошибок.
JSON_ERROR_DEPTH (int)
Превышена максимальная глубина стека.
JSON_ERROR_STATE_MISMATCH (int)
Ошибка возникает из-за нарушения JSON-формата, например из-за преждевременного завершения структуры, или когда декодируемая структура не соответствует ожидаемой, например, когда вместо объекта встречается массив.
JSON_ERROR_CTRL_CHAR (int)
Ошибка управляющих символов, вероятно, из-за неверного кодирования.
JSON_ERROR_SYNTAX (int)
Синтаксическая ошибка.
JSON_ERROR_UTF8 (int)
Символы сформированы с нарушением правил кодировки UTF-8, что часто возникает из-за неправильного кодирования.
JSON_ERROR_RECURSION (int)
Объект или массив, который передали в функцию json_encode(), содержит рекурсивные ссылки и аргумент невозможно закодировать. При передаче опции JSON_PARTIAL_OUTPUT_ON_ERROR рекурсивные ссылки кодируются как значение null.
JSON_ERROR_INF_OR_NAN (int)
Значение, которое передали в функцию json_encode(), включает либо значение NAN, либо значение INF. С опцией JSON_PARTIAL_OUTPUT_ON_ERROR эти особые числа кодируются как значение 0.
JSON_ERROR_UNSUPPORTED_TYPE (int)
В функцию json_encode() передали значение неподдерживаемого типа наподобие resource. С опцией JSON_PARTIAL_OUTPUT_ON_ERROR неподдерживаемые значения кодируются как null.
JSON_ERROR_INVALID_PROPERTY_NAME (int)
В строке, которую передали в функцию json_decode() при декодировании JSON-объекта в PHP, содержался ключ, который начинается с символа \u0000.
JSON_ERROR_UTF16 (int)
В JSON-строке, которую передали в функцию json_decode(), содержится экранированная Unicode-последовательность с одним непарным суррогатом из кодировки UTF-16.
JSON_ERROR_NON_BACKED_ENUM (int)
Значение, которое передали в функцию json_encode(), включает нетипизированное перечисление, которые в PHP не сериализуются. Константа доступна с PHP 8.1.0.

Следующие константы передают в функцию json_decode() отдельно или комбинируют.

JSON_BIGINT_AS_STRING (int)
Декодирует большие целые числа как исходное строковое значение этих чисел.
JSON_OBJECT_AS_ARRAY (int)
Преобразовывает JSON-объекты в PHP-массив. Опция задаётся автоматически, если вызвать функцию json_decode() и указать вторым аргументом значение true.

Следующие константы передают в функцию json_encode() отдельно или комбинируют.

JSON_HEX_TAG (int)
Символы < и > преобразовываются в последовательности \u003C и \u003E.
JSON_HEX_AMP (int)
Символы & преобразовываются в последовательность \u0026.
JSON_HEX_APOS (int)
Символы ' преобразовываются в последовательность \u0027.
JSON_HEX_QUOT (int)
Символы " преобразовываются в последовательность \u0022.
JSON_FORCE_OBJECT (int)
Выводит объект, а не массив, при кодировании неассоциативного массива. Это полезно, когда кодируется пустой массив, а получатель вывода ожидает объект.
JSON_NUMERIC_CHECK (int)
Кодирует числовые строки как числа.
JSON_PRETTY_PRINT (int)
Форматирует данные возврата с добавлением пробельных символов.
JSON_UNESCAPED_SLASHES (int)
Не экранировать символы /.
JSON_UNESCAPED_UNICODE (int)
Не кодировать многобайтовые символы Юникода, которые по умолчанию кодируются как последовательности \uXXXX.
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
Вместо прерывания с ошибкой замещает значения, которые невозможно закодировать, значением null.
JSON_PRESERVE_ZERO_FRACTION (int)
Гарантирует, что значение, которое принадлежит типу float, кодируется как значение с плавающей точкой, когда дробная часть равна 0.
JSON_UNESCAPED_LINE_TERMINATORS (int)
При передаче флага с опцией JSON_UNESCAPED_UNICODE символы конца строки остаются неэкранированными. Флаг ведёт себя так же, как и до PHP 7.1 без опции. Константа доступна с PHP 7.1.0.

Следующие константы передают в функции json_decode() и json_encode() отдельно или комбинируют.

JSON_INVALID_UTF8_IGNORE (int)
Игнорировать некорректные символы кодировки UTF-8. Константа доступна с PHP 7.2.0.
JSON_INVALID_UTF8_SUBSTITUTE (int)
Преобразовывать недопустимые для кодировки UTF-8 символы в последовательность \0xfffd — Юникод-символ 'REPLACEMENT CHARACTER'. Константа доступна с PHP 7.2.0.
JSON_THROW_ON_ERROR (int)
С этим флагом вместо установки глобального состояния ошибки, которое извлекается функциями json_last_error() и json_last_error_msg(), функции кодирования и декодирования выбрасывают исключение JsonException, если возникает ошибка. Константа JSON_PARTIAL_OUTPUT_ON_ERROR приоритетнее константы JSON_THROW_ON_ERROR. Константа доступна с PHP 7.3.0.
Добавить

Примечания пользователей 6 notes

up
89
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
31
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
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
8 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
-3
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