PHP Conference Nagoya 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() был ключ, начинающийся с символа \u0000.
JSON_ERROR_UTF16 (int)
Один непарный суррогат UTF-16 в экранированной последовательности Unicode в строке JSON, переданной в json_decode().

Можно комбинировать следующие константы для передачи в 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)
Не кодировать многобайтовые символы Unicode (по умолчанию они кодируются как \uXXXX).
JSON_PARTIAL_OUTPUT_ON_ERROR (int)
Позволяет избежать возникновения ошибок при использовании функции json_encode. Осуществляет подстановку значений по умолчанию вместо некодируемых.
JSON_PRESERVE_ZERO_FRACTION (int)
Гарантирует, что значение типа float будет преобразовано именно в значение типа 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)
Выбрасывается исключение JsonException, если возникла ошибка, вместо установки глобального состояния ошибки, которое может быть получено функциями json_last_error() и json_last_error_msg(). Константа JSON_PARTIAL_OUTPUT_ON_ERROR имеет приоритет над JSON_THROW_ON_ERROR. Доступна с PHP 7.3.0.
JSON_ERROR_NON_BACKED_ENUM (int)
Аргумент функции json_encode() содержит нетипизированное перечисление, которое нельзя сериализовать. Доступна с PHP 8.1.0.
Добавить

Примечания пользователей 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
2 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
-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