(PHP 5 >= 5.3.0, PHP 7, PHP
json_last_error — Возвращает последнюю ошибку
Описание
json_last_error(): int
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих
констант:
Константа | Значение | Доступность |
---|---|---|
JSON_ERROR_NONE |
Ошибок нет | |
JSON_ERROR_DEPTH |
Достигнута максимальная глубина стека | |
JSON_ERROR_STATE_MISMATCH |
Неверный или некорректный JSON | |
JSON_ERROR_CTRL_CHAR |
Ошибка управляющего символа, возможно неверная кодировка | |
JSON_ERROR_SYNTAX |
Синтаксическая ошибка | |
JSON_ERROR_UTF8 |
Некорректные символы UTF-8, возможно неверная кодировка | |
JSON_ERROR_RECURSION |
Одна или несколько зацикленных ссылок в кодируемом значении | |
JSON_ERROR_INF_OR_NAN |
Одно или несколько значенийNAN или INF в кодируемом значении |
|
JSON_ERROR_UNSUPPORTED_TYPE |
Передано значение с неподдерживаемым типом | |
JSON_ERROR_INVALID_PROPERTY_NAME |
Имя свойства не может быть закодировано | |
JSON_ERROR_UTF16 |
Некорректный символ UTF-16, возможно некорректно закодирован |
Примеры
Пример #1 Пример использования json_last_error()
<?php
// Верная json-строка
$json[] = '{"Organization": "PHP Documentation Team"}';// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ' вместо "
$json[] = "{'Organization': 'PHP Documentation Team'}";
foreach (
$json as $string) {
echo 'Декодируем: ' . $string;
json_decode($string);
switch (
json_last_error()) {
case JSON_ERROR_NONE:
echo ' - Ошибок нет';
break;
case JSON_ERROR_DEPTH:
echo ' - Достигнута максимальная глубина стека';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Некорректные разряды или несоответствие режимов';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Некорректный управляющий символ';
break;
case JSON_ERROR_SYNTAX:
echo ' - Синтаксическая ошибка, некорректный JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Некорректные символы UTF-8, возможно неверно закодирован';
break;
default:
echo ' - Неизвестная ошибка';
break;
}
echo
PHP_EOL;
}
?>
Результат выполнения данного примера:
Декодируем: {"Organization": "PHP Documentation Team"} - Ошибок нет Декодируем: {'Organization': 'PHP Documentation Team'} - Синтаксическая ошибка, некорректный JSON
Пример #2 Совместное использование json_last_error() и json_encode()
<?php
// Некорректная последовательность UTF8
$text = "xB1x31";$json = json_encode($text);
$error = json_last_error();var_dump($json, $error === JSON_ERROR_UTF8);
?>
Результат выполнения данного примера:
string(4) "null" bool(true)
Пример #3 json_last_error() и JSON_THROW_ON_ERROR
<?php
// Некорректная последовательность UTF8, вызывающая JSON_ERROR_UTF8
json_encode("xB1x31");// Не вызовет ошибки JSON
json_encode('okay', JSON_THROW_ON_ERROR);// Глобальное состояние не будет изменено json_encode()
var_dump(json_last_error() === JSON_ERROR_UTF8);
?>
Результат выполнения данного примера:
Смотрите также
- json_last_error_msg() — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
- json_decode() — Декодирует строку JSON
- json_encode() — Возвращает JSON-представление данных
jimmetry at gmail dot com ¶
11 years ago
While this can obviously change between versions, the current error codes are as follows:
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8
I'm only posting these for people who may be trying to understand why specific JSON files are not being decoded. Please do not hard-code these numbers into an error handler routine.
praveenscience at gmail dot com ¶
8 years ago
I used this simple script, flicked from StackOverflow to escape from the function failing:
<?php
function utf8ize($d) {
if (is_array($d)) {
foreach ($d as $k => $v) {
$d[$k] = utf8ize($v);
}
} else if (is_string ($d)) {
return utf8_encode($d);
}
return $d;
}
?>
Cheers,
Praveen Kumar!
msxcms at bmforum dot com ¶
5 years ago
use this code with mb_convert_encoding, you can json_encode some corrupt UTF-8 chars
function safe_json_encode($value, $options = 0, $depth = 512) {
$encoded = json_encode($value, $options, $depth);
if ($encoded === false && $value && json_last_error() == JSON_ERROR_UTF8) {
$encoded = json_encode(utf8ize($value), $options, $depth);
}
return $encoded;
}
function utf8ize($mixed) {
if (is_array($mixed)) {
foreach ($mixed as $key => $value) {
$mixed[$key] = utf8ize($value);
}
} elseif (is_string($mixed)) {
return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
}
return $mixed;
}
hemono at gmail dot com ¶
7 years ago
when json_decode a empty string, PHP7 will trigger an Syntax error:
<?php
json_decode("");
var_dump(json_last_error(), json_last_error_msg());// PHP 7
int(4)
string(12) "Syntax error"// PHP 5
int(0)
string(8) "No error"
George Dimitriadis ¶
6 years ago
Just adding this note since I had to code this for the actual values reference.
<?phpecho JSON_ERROR_NONE . ' JSON_ERROR_NONE' . '<br />';
echo JSON_ERROR_DEPTH . ' JSON_ERROR_DEPTH' . '<br />';
echo JSON_ERROR_STATE_MISMATCH . ' JSON_ERROR_STATE_MISMATCH' . '<br />';
echo JSON_ERROR_CTRL_CHAR . ' JSON_ERROR_CTRL_CHAR' . '<br />';
echo JSON_ERROR_SYNTAX . ' JSON_ERROR_SYNTAX' . '<br />';
echo JSON_ERROR_UTF8 . ' JSON_ERROR_UTF8' . '<br />';
echo JSON_ERROR_RECURSION . ' JSON_ERROR_RECURSION' . '<br />';
echo JSON_ERROR_INF_OR_NAN . ' JSON_ERROR_INF_OR_NAN' . '<br />';
echo JSON_ERROR_UNSUPPORTED_TYPE . ' JSON_ERROR_UNSUPPORTED_TYPE' . '<br />';/*
The above outputs :
0 JSON_ERROR_NONE
1 JSON_ERROR_DEPTH
2 JSON_ERROR_STATE_MISMATCH
3 JSON_ERROR_CTRL_CHAR
4 JSON_ERROR_SYNTAX
5 JSON_ERROR_UTF8
6 JSON_ERROR_RECURSION
7 JSON_ERROR_INF_OR_NAN
8 JSON_ERROR_UNSUPPORTED_TYPE
*/?>
wedge at atlanteans dot net ¶
4 years ago
here is a small updated version of utf8ize that has the following addition :
* It uses iconv instead of utf8_encode for potentially better result.
* It adds the support of objects variable
* It also update array key value (in a case I met I had to utf8ize the key as well as those were generated from a user input value)
Here is the code.
<?php
function utf8ize($d) {
if (is_array($d)) {
foreach ($d as $k => $v) {
unset($d[$k]);
$d[utf8ize($k)] = utf8ize($v);
}
} else if (is_object($d)) {
$objVars = get_object_vars($d);
foreach($objVars as $key => $value) {
$d->$key = utf8ize($value);
}
} else if (is_string ($d)) {
return iconv('UTF-8', 'UTF-8//IGNORE', utf8_encode($d));
}
return $d;
}
?>
williamprogphp at yahoo dot com dot br ¶
9 years ago
This is a quite simple and functional trick to validate JSON's strings.
<?phpfunction json_validate($string) {
if (is_string($string)) {
@json_decode($string);
return (json_last_error() === JSON_ERROR_NONE);
}
return false;
}
echo (json_validate('{"test": "valid JSON"}') ? "It's a JSON" : "NOT is a JSON"); // prints 'It's a JSON'
echo (json_validate('{test: valid JSON}') ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to missing quotes
echo (json_validate(array()) ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to a non-string argument
?>
Cheers
За последние 24 часа нас посетили 11552 программиста и 1146 роботов. Сейчас ищут 202 программиста …
json_last_error
(PHP 5 >= 5.3.0, PHP 7)
json_last_error — Возвращает последнюю ошибку
Описание
int json_last_error
( void
)
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих
констант:
Константа | Значение | Доступность |
---|---|---|
JSON_ERROR_NONE |
Ошибок нет | |
JSON_ERROR_DEPTH |
Достигнута максимальная глубина стека | |
JSON_ERROR_STATE_MISMATCH |
Неверный или не корректный JSON | |
JSON_ERROR_CTRL_CHAR |
Ошибка управляющего символа, возможно неверная кодировка | |
JSON_ERROR_SYNTAX |
Синтаксическая ошибка | |
JSON_ERROR_UTF8 |
Некорректные символы UTF-8, возможно неверная кодировка | PHP 5.3.3 |
JSON_ERROR_RECURSION |
Одна или несколько зацикленных ссылок в кодируемом значении | PHP 5.5.0 |
JSON_ERROR_INF_OR_NAN |
Одно или несколько значенийNAN или INF в кодируемом значении |
PHP 5.5.0 |
JSON_ERROR_UNSUPPORTED_TYPE |
Передано значение с неподдерживаемым типом | PHP 5.5.0 |
Примеры
Пример #1 Пример использования json_last_error()
<?php
// Верная json-строка
$json[] = '{"Organization": "PHP Documentation Team"}';// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ' вместо "
$json[] = "{'Organization': 'PHP Documentation Team'}";
foreach (
$json as $string) {
echo 'Декодируем: ' . $string;
json_decode($string);
switch (
json_last_error()) {
case JSON_ERROR_NONE:
echo ' - Ошибок нет';
break;
case JSON_ERROR_DEPTH:
echo ' - Достигнута максимальная глубина стека';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Некорректные разряды или не совпадение режимов';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Некорректный управляющий символ';
break;
case JSON_ERROR_SYNTAX:
echo ' - Синтаксическая ошибка, не корректный JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Некорректные символы UTF-8, возможно неверная кодировка';
break;
default:
echo ' - Неизвестная ошибка';
break;
}
echo
PHP_EOL;
}
?>
Результат выполнения данного примера:
Декодируем: {"Organization": "PHP Documentation Team"} - Ошибок нет Декодируем: {'Organization': 'PHP Documentation Team'} - Синтаксическая ошибка, некорректный JSON
Пример #2 Совместное использование json_last_error() и json_encode()
<?php
// Некорректная последователньость UTF8
$text = "xB1x31";$json = json_encode($text);
$error = json_last_error();var_dump($json, $error === JSON_ERROR_UTF8);
?>
Результат выполнения данного примера:
string(4) "null" bool(true)
Смотрите также
- json_last_error_msg() — Returns the error string of the last json_encode() or json_decode() call
- json_decode() — Декодирует JSON строку
- json_encode() — Возвращает JSON-представление данных
Вернуться к: JSON Функции
Содержание
- PHP JSON
- Вступление
- Синтаксис
- параметры
- замечания
- Декодирование строки JSON
- Кодирование строки JSON
- аргументы
- JSON_FORCE_OBJECT
- JSON_HEX_TAG , JSON_HEX_AMP , JSON_HEX_APOS , JSON_HEX_QUOT
- JSON_NUMERIC_CHECK
- JSON_PRETTY_PRINT
- JSON_UNESCAPED_SLASHES
- JSON_UNESCAPED_UNICODE
- JSON_PARTIAL_OUTPUT_ON_ERROR
- JSON_PRESERVE_ZERO_FRACTION
- JSON_UNESCAPED_LINE_TERMINATORS
- Отладка ошибок JSON
- json_last_error_msg
- json_last_error
- Использование JsonSerializable в объекте
- пример значений свойств.
- Использование частных и защищенных свойств с помощью json_encode()
- Выход:
- Заголовок json и возвращаемый ответ
- PHP: json_encode / json_decode error handling.
- Парсинг многоэтажного json?
PHP
JSON
Вступление
JSON ( JavaScript Object Notation ) — это независимый от платформы и язык способ сериализации объектов в открытый текст. Поскольку он часто используется в Интернете, а также PHP, существует базовое расширение для работы с JSON в PHP.
Синтаксис
- string json_encode (mixed $ value [, int $ options = 0 [, int $ depth = 512]])
- смешанный json_decode (строка $ json [, bool $ assoc = false [, int $ depth = 512 [, int $ options = 0]]])
параметры
параметр | подробности |
---|---|
json_encode | — |
значение | Кодирование значения. Может быть любым типом, кроме ресурса. Все строковые данные должны кодироваться в кодировке UTF-8. |
опции | Бит-маска, состоящая из JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR. Поведение этих констант описано на странице констант JSON . |
глубина | Установите максимальную глубину. Должно быть больше нуля. |
json_decode | — |
JSON | Строка json декодируется. Эта функция работает только с закодированными строками UTF-8. |
ассоциативный | Функция должна возвращать ассоциативный массив вместо объектов. |
опции | Бит-маска параметров декодирования JSON. В настоящее время поддерживается только JSON_BIGINT_AS_STRING (по умолчанию используется большое число целых чисел в виде поплавков) |
замечания
- Обработка json_decode недопустимого JSON очень шелушащая, и очень сложно надежно определить, удалось ли декодировать, json_decode возвращает значение null для недопустимого ввода, хотя null также является вполне допустимым объектом для JSON для декодирования. Чтобы предотвратить такие проблемы, вы всегда должны вызывать json_last_error каждый раз, когда используете его.
Декодирование строки JSON
Функция json_decode() принимает JSON-кодированную строку в качестве своего первого параметра и анализирует ее в переменной PHP.
Обычно json_decode() возвращает объект stdClass, если элемент верхнего уровня в объекте JSON является словарем или индексированным массивом, если объект JSON является массивом. Он также вернет скалярные значения или NULL для определенных скалярных значений, таких как простые строки, «true» , «false» и «null» . Он также возвращает NULL при любой ошибке.
Используйте var_dump() для просмотра типов и значений каждого свойства объекта, который мы расшифровали выше.
Выход (обратите внимание на типы переменных):
Примечание. Типы переменных в JSON были преобразованы в их эквивалент PHP.
Чтобы вернуть ассоциативный массив для объектов JSON вместо возвращения объекта, передайте true как второй параметр json_decode() .
Вывод (обратите внимание на ассоциативную структуру массива):
Второй параметр ( $assoc ) не действует, если возвращаемая переменная не является объектом.
Примечание. Если вы используете параметр $assoc , вы потеряете различие между пустым массивом и пустым объектом. Это означает, что запуск json_encode() на вашем декодированном выходе снова приведет к другой структуре JSON.
Если строка JSON имеет «глубину» более 512 элементов ( 20 элементов в версиях старше 5.2.3 или 128 в версии 5.2.3 ) в рекурсии, функция json_decode() возвращает NULL . В версиях 5.3 или новее этот предел можно контролировать с помощью третьего параметра ( $depth ), как обсуждается ниже.
PHP реализует надмножество JSON, как указано в оригинале »RFC 4627 — он также кодирует и декодирует скалярные типы и NULL. RFC 4627 поддерживает только эти значения, когда они вложены внутри массива или объекта. Хотя это дополнение соответствует расширенному определению «текста JSON» в новой версии RFC 7159 (целью которого является замещение RFC 4627) и « ECMA-404» , это может вызвать проблемы совместимости со старыми анализаторами JSON, которые строго придерживаются RFC 4627, когда кодируя одно скалярное значение.
Это означает, что, например, простая строка будет считаться допустимым объектом JSON в PHP:
Но простые строки, а не в массиве или объекте, не являются частью стандарта RFC 4627 . В результате такие онлайн-шашки, как JSLint , JSON Formatter & Validator (в режиме RFC 4627) дадут вам ошибку.
Для глубины рекурсии существует третий параметр $depth (значение по умолчанию — 512 ), что означает количество вложенных объектов внутри исходного объекта, подлежащего декодированию.
Существует четвертый параметр $options . В настоящее время он принимает только одно значение: JSON_BIGINT_AS_STRING . Поведение по умолчанию (которое оставляет эту опцию) заключается в том, чтобы отличать целые числа от float вместо строк.
Недействительные варианты с нижним регистром истинных, ложных и нулевых литералов больше не принимаются в качестве допустимого ввода.
Итак, этот пример:
Аналогичное поведение имеет место для false и null .
Обратите внимание, что json_decode() возвращает NULL если строка не может быть преобразована.
Небезопасно полагаться только на возвращаемое значение NULL для обнаружения ошибок. Например, если строка JSON содержит ничего, кроме «null» , json_decode() вернет значение null , даже если ошибка не возникла.
Кодирование строки JSON
Функция json_encode преобразует массив PHP (или, начиная с PHP 5.4, объект, который реализует интерфейс JsonSerializable ) в строку, закодированную в JSON. Он возвращает строку с кодировкой JSON при успешном завершении или FALSE при сбое.
Во время кодирования строки данных типа PHP, integer и boolean преобразуются в эквивалент JSON. Ассоциативные массивы кодируются как объекты JSON, а при вызове с аргументами по умолчанию индексированные массивы кодируются как массивы JSON. (Если ключи массива не являются непрерывной числовой последовательностью, начиная с 0, в этом случае массив будет закодирован как объект JSON.)
аргументы
Начиная с PHP 5.3, второй аргумент json_encode является битовой маской, которая может быть одной или несколькими из следующих.
Как и в любой битовой маске, их можно комбинировать с двоичным оператором OR | ,
JSON_FORCE_OBJECT
Заставляет создать объект вместо массива
JSON_HEX_TAG , JSON_HEX_AMP , JSON_HEX_APOS , JSON_HEX_QUOT
Обеспечивает следующие преобразования во время кодирования:
постоянная | вход | Выход |
---|---|---|
JSON_HEX_TAG | u003C | |
JSON_HEX_TAG | > | u003E |
JSON_HEX_AMP | & | u0026 |
JSON_HEX_APOS | ‘ | u0027 |
JSON_HEX_QUOT | « | u0022 |
JSON_NUMERIC_CHECK
Обеспечивает преобразование числовых строк в целые числа.
JSON_PRETTY_PRINT
Делает JSON легко читаемым
JSON_UNESCAPED_SLASHES
Включает неэкранированные / косые черты на выходе
JSON_UNESCAPED_UNICODE
Включает символы с кодировкой UTF8 в выводе вместо u -encoded строк.
JSON_PARTIAL_OUTPUT_ON_ERROR
Позволяет продолжить кодирование, если встречаются некоторые неприменимые значения.
JSON_PRESERVE_ZERO_FRACTION
Обеспечивает, чтобы поплавки всегда кодировались как плавающие.
JSON_UNESCAPED_LINE_TERMINATORS
При использовании с JSON_UNESCAPED_UNICODE возвращается к поведению старых версий PHP и не выходит из символов U + 2028 LINE SEPARATOR и U + 2029 PARAPRAPH SEPARATOR. Хотя они действительны в JSON, эти символы недействительны в JavaScript, поэтому поведение по умолчанию JSON_UNESCAPED_UNICODE было изменено в версии 7.1.
Отладка ошибок JSON
Когда json_encode или json_decode не удается проанализировать предоставленную строку, он вернет false . Сам PHP не вызывает никаких ошибок или предупреждений, когда это происходит, бремя на пользователя заключается в использовании функций json_last_error () и json_last_error_msg (), чтобы проверить, произошла ли ошибка и действовать соответственно в вашем приложении (отладить ее, показать сообщение об ошибке , так далее.).
В следующем примере показана общая ошибка при работе с JSON, неспособность декодировать / кодировать строку JSON (например, из-за передачи плохой кодированной строки UTF-8) .
json_last_error_msg
json_last_error_msg() возвращает человекообразное сообщение о последней ошибке, возникшей при попытке кодирования / декодирования строки.
- Эта функция всегда вернет строку , даже если ошибка не возникла.
Строка по умолчанию без ошибок не No Error - Он вернет false если произошла какая-либо другая (неизвестная) ошибка
- Будьте осторожны при использовании этого в циклах, поскольку json_last_error_msg будет переопределяться на каждой итерации.
Вы должны использовать эту функцию только для получения сообщения для отображения, а не для проверки в контрольных операторах.
Эта функция не существует до PHP 5.5. Вот реализация полиполнения:
json_last_error
json_last_error() возвращает целое число, сопоставленное с одной из предварительно определенных констант, предоставляемых PHP.
постоянная | Имея в виду |
---|---|
JSON_ERROR_NONE | Ошибка не произошла |
JSON_ERROR_DEPTH | Максимальная глубина стека превышена |
JSON_ERROR_STATE_MISMATCH | Недопустимый или некорректный JSON |
JSON_ERROR_CTRL_CHAR | Ошибка контрольного символа, возможно, неправильно закодированная |
JSON_ERROR_SYNTAX | Ошибка синтаксиса (с PHP 5.3.3) |
JSON_ERROR_UTF8 | Малоформатные символы UTF-8, возможно, некорректно закодированные (начиная с PHP 5.5.0) |
JSON_ERROR_RECURSION | Одна или несколько рекурсивных ссылок в кодируемом значении |
JSON_ERROR_INF_OR_NAN | Один или несколько значений NAN или INF в кодируемом значении |
JSON_ERROR_UNSUPPORTED_TYPE | Дано значение типа, который не может быть закодирован. |
Использование JsonSerializable в объекте
Когда вы создаете API REST, вам может потребоваться уменьшить информацию об объекте, который будет передан клиентскому приложению. С этой целью в этом примере показано, как использовать интерфейс JsonSerialiazble .
В этом примере User класса фактически расширяет объект модели DB гипотетической ORM.
Добавьте реализацию JsonSerializable в класс, предоставив метод jsonSerialize() .
Теперь в вашем контроллере приложения или скрипте при передаче объекта User в json_encode() вы получите возвращаемый json-кодированный массив метода jsonSerialize() вместо всего объекта.
пример значений свойств.
Это уменьшит количество данных, возвращаемых конечной точкой RESTful, и позволит исключить свойства объекта из представления json.
Использование частных и защищенных свойств с помощью json_encode()
Чтобы избежать использования JsonSerializable, также можно использовать частные или защищенные свойства, чтобы скрыть информацию о классе из вывода json_encode() . Затем классу не нужно реализовывать JsonSerializable.
Функция json_encode () будет кодировать только общедоступные свойства класса в JSON.
Выход:
Заголовок json и возвращаемый ответ
Добавив заголовок с типом контента как JSON:
Заголовок там, так что ваше приложение может обнаружить, какие данные были возвращены и как он должен справиться с этим.
Обратите внимание: заголовок содержимого представляет собой только информацию о типе возвращаемых данных.
Если вы используете UTF-8, вы можете использовать:
Источник
PHP: json_encode / json_decode error handling.
Unfortunately, the error handling in the earlier versions of PHP is non-existent. It wasn’t until PHP version 5.3.0 that the function json_last_error was introduced that. Before that, json_encode would return a NULL value or a FALSE value and you’d have to use an external JSON validation tool to try and figure out what was going wrong.
For example, if your data had special (non-UTF8) characters, the json_encode function would often return a NULL value. If the depth of your PHP array was too “deep”, then it would return a FALSE value. The json_decode function was also pretty similar in the way that it returned NULL whenever it received malformed / incorrect JSON strings.
Prior to PHP 5.3.0, JSON error handling in PHP looked a little like this (throwing Exceptions):
or, with json_decode:
Thankfully, in PHP 5.3.0, the function json_last_error was introduced. If an error has occurred, it will return one of the following constants:
- JSON_ERROR_NONE: No error has occured.
- JSON_ERROR_DEPTH: Max depth exceeded.
- JSON_ERROR_STATE_MISMATCH: Invalid JSON.
- JSON_ERROR_CTRL_CHAR: Bad character was found.
In PHP 5.3.3, another constant was added:
- JSON_ERROR_UTF8: Bad UTF8 character was found. Incorrect encoding.
Then, in PHP 5.5, they added three more constants:
- JSON_ERROR_RECURSION: Recursion detected.
- JSON_ERROR_INF_OR_NAN: One or more NAN or INF values in the value to be encoded.
- JSON_ERROR_UNSUPPORTED_TYPE: An unsupported type was found.
Using these constants, we can carry out our error handling like so:
Unfortunately, this isn’t the type of code that you should be repeating throughout your script. If you stay true to the DRY (Don’t Repeat Yourself) principle (which you should), then you will wrap this kind of error checking into a function or a class method.
Personally, I would prefer it if json_last_error returned a string-based error message (like the internal XML library does). That way, you wouldn’t need to implement an ugly-looking switch statement.
Still, at least it is far more informative than it used to be!
Источник
Парсинг многоэтажного json?
Есть огромный json:, пытаюсь обработать его через json_decode и получаю:
Т.е., обрабатывает, но не полностью
Как можно получить доступ к оставшемуся куску json?
- Вопрос задан более трёх лет назад
- 3132 просмотра
Оценить 4 комментария
JSON_ERROR_RECURSION One or more recursive references in the value to be encoded
скорее всего проблема в правильности самого json
json_decode пропускает значения, если они были сформированы неправильно (не по описанному стандарту)
Для debug: после json_decode вставить что-то типа:
ну а дальше уже действовать по обстоятельствам 🙂
Я все же сильно сомневаюсь в том что у вас стандартный JSON. Он у вас игнорируется, не парсится. Так что можно предположить вто чнутри json еще один json как строка и его надо парсить отдельно. Ибо если бы была ошибка по глубине json_decode выдал бы null и тогда можно было бы отлавливать это через json_get_error (или как-то так). В документации есть пример как хэндлить такие случаи.
Так же попробуйте сторонние парсеры: https://github.com/Seldaek/jsonlint например. Оно должно нормально разобрать если у вас нормальный json.
Если же у вас слоенка с JSON то нужно вручную рекурсивно обходить полученный массив/объект и пробовать делать json_decode. Если поддается, оставляем. НЕ поддается — оставляем старое значение.
Источник
json_last_error
(PHP 5 >= 5.3.0, PHP 7)
json_last_error — Возвращает последнюю ошибку
Описание
json_last_error
( void
) : int
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих
констант:
Константа | Значение | Доступность |
---|---|---|
JSON_ERROR_NONE |
Ошибок нет | |
JSON_ERROR_DEPTH |
Достигнута максимальная глубина стека | |
JSON_ERROR_STATE_MISMATCH |
Неверный или некорректный JSON | |
JSON_ERROR_CTRL_CHAR |
Ошибка управляющего символа, возможно неверная кодировка | |
JSON_ERROR_SYNTAX |
Синтаксическая ошибка | |
JSON_ERROR_UTF8 |
Некорректные символы UTF-8, возможно неверная кодировка | PHP 5.3.3 |
JSON_ERROR_RECURSION |
Одна или несколько зацикленных ссылок в кодируемом значении | PHP 5.5.0 |
JSON_ERROR_INF_OR_NAN |
Одно или несколько значенийNAN или INF в кодируемом значении |
PHP 5.5.0 |
JSON_ERROR_UNSUPPORTED_TYPE |
Передано значение с неподдерживаемым типом | PHP 5.5.0 |
JSON_ERROR_INVALID_PROPERTY_NAME |
Имя свойства не может быть закодировано | PHP 7.0.0 |
JSON_ERROR_UTF16 |
Некорректный символ UTF-16, возможно некорректно закодирован | PHP 7.0.0 |
Примеры
Пример #1 Пример использования json_last_error()
<?php
// Верная json-строка
$json[] = '{"Organization": "PHP Documentation Team"}';// Неверная json-строка, которая вызовет синтаксическую ошибку,
// здесь в качестве кавычек мы используем ' вместо "
$json[] = "{'Organization': 'PHP Documentation Team'}";
foreach (
$json as $string) {
echo 'Декодируем: ' . $string;
json_decode($string);
switch (
json_last_error()) {
case JSON_ERROR_NONE:
echo ' - Ошибок нет';
break;
case JSON_ERROR_DEPTH:
echo ' - Достигнута максимальная глубина стека';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Некорректные разряды или несоответствие режимов';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Некорректный управляющий символ';
break;
case JSON_ERROR_SYNTAX:
echo ' - Синтаксическая ошибка, некорректный JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Некорректные символы UTF-8, возможно неверно закодирован';
break;
default:
echo ' - Неизвестная ошибка';
break;
}
echo
PHP_EOL;
}
?>
Результат выполнения данного примера:
Декодируем: {"Organization": "PHP Documentation Team"} - Ошибок нет Декодируем: {'Organization': 'PHP Documentation Team'} - Синтаксическая ошибка, некорректный JSON
Пример #2 Совместное использование json_last_error() и json_encode()
<?php
// Некорректная последовательность UTF8
$text = "xB1x31";$json = json_encode($text);
$error = json_last_error();var_dump($json, $error === JSON_ERROR_UTF8);
?>
Результат выполнения данного примера:
string(4) "null" bool(true)
Пример #3 json_last_error() и JSON_THROW_ON_ERROR
<?php
// Некорректная последовательность UTF8, вызывающая JSON_ERROR_UTF8
json_encode("xB1x31");// Не вызовет ошибки JSON
json_encode('okay', JSON_THROW_ON_ERROR);// Глобальное состояние не будет изменено json_encode()
var_dump(json_last_error() === JSON_ERROR_UTF8);
?>
Результат выполнения данного примера:
Смотрите также
- json_last_error_msg() — Возвращает строку с сообщением об ошибке последнего вызова json_encode() или json_decode()
- json_decode() — Декодирует строку JSON
- json_encode() — Возвращает JSON-представление данных
Вступление
JSON ( JavaScript Object Notation ) — это независимый от платформы и язык способ сериализации объектов в открытый текст. Поскольку он часто используется в Интернете, а также PHP, существует базовое расширение для работы с JSON в PHP.
Синтаксис
- string json_encode (mixed $ value [, int $ options = 0 [, int $ depth = 512]])
- смешанный json_decode (строка $ json [, bool $ assoc = false [, int $ depth = 512 [, int $ options = 0]]])
параметры
параметр | подробности |
---|---|
json_encode | — |
значение | Кодирование значения. Может быть любым типом, кроме ресурса. Все строковые данные должны кодироваться в кодировке UTF-8. |
опции | Бит-маска, состоящая из JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR. Поведение этих констант описано на странице констант JSON . |
глубина | Установите максимальную глубину. Должно быть больше нуля. |
json_decode | — |
JSON | Строка json декодируется. Эта функция работает только с закодированными строками UTF-8. |
ассоциативный | Функция должна возвращать ассоциативный массив вместо объектов. |
опции | Бит-маска параметров декодирования JSON. В настоящее время поддерживается только JSON_BIGINT_AS_STRING (по умолчанию используется большое число целых чисел в виде поплавков) |
замечания
- Обработка json_decode недопустимого JSON очень шелушащая, и очень сложно надежно определить, удалось ли декодировать, json_decode возвращает значение null для недопустимого ввода, хотя null также является вполне допустимым объектом для JSON для декодирования. Чтобы предотвратить такие проблемы, вы всегда должны вызывать json_last_error каждый раз, когда используете его.
Функция json_decode()
принимает JSON-кодированную строку в качестве своего первого параметра и анализирует ее в переменной PHP.
Обычно json_decode()
возвращает объект stdClass, если элемент верхнего уровня в объекте JSON является словарем или индексированным массивом, если объект JSON является массивом. Он также вернет скалярные значения или NULL
для определенных скалярных значений, таких как простые строки, "true"
, "false"
и "null"
. Он также возвращает NULL
при любой ошибке.
// Returns an object (The top level item in the JSON string is a JSON dictionary)
$json_string = '{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}';
$object = json_decode($json_string);
printf('Hello %s, You are %s years old.', $object->name, $object->age);
#> Hello Jeff, You are 20 years old.
// Returns an array (The top level item in the JSON string is a JSON array)
$json_string = '["Jeff", 20, true, ["red", "blue"]]';
$array = json_decode($json_string);
printf('Hello %s, You are %s years old.', $array[0], $array[1]);
Используйте var_dump()
для просмотра типов и значений каждого свойства объекта, который мы расшифровали выше.
// Dump our above $object to view how it was decoded
var_dump($object);
Выход (обратите внимание на типы переменных):
class stdClass#2 (4) {
["name"] => string(4) "Jeff"
["age"] => int(20)
["active"] => bool(true)
["colors"] =>
array(2) {
[0] => string(3) "red"
[1] => string(4) "blue"
}
}
Примечание. Типы переменных в JSON были преобразованы в их эквивалент PHP.
Чтобы вернуть ассоциативный массив для объектов JSON вместо возвращения объекта, передайте true
как второй параметр json_decode()
.
$json_string = '{"name": "Jeff", "age": 20, "active": true, "colors": ["red", "blue"]}';
$array = json_decode($json_string, true); // Note the second parameter
var_dump($array);
Вывод (обратите внимание на ассоциативную структуру массива):
array(4) {
["name"] => string(4) "Jeff"
["age"] => int(20)
["active"] => bool(true)
["colors"] =>
array(2) {
[0] => string(3) "red"
[1] => string(4) "blue"
}
}
Второй параметр ( $assoc
) не действует, если возвращаемая переменная не является объектом.
Примечание. Если вы используете параметр $assoc
, вы потеряете различие между пустым массивом и пустым объектом. Это означает, что запуск json_encode()
на вашем декодированном выходе снова приведет к другой структуре JSON.
Если строка JSON имеет «глубину» более 512 элементов ( 20 элементов в версиях старше 5.2.3 или 128 в версии 5.2.3 ) в рекурсии, функция json_decode()
возвращает NULL
. В версиях 5.3 или новее этот предел можно контролировать с помощью третьего параметра ( $depth
), как обсуждается ниже.
Согласно руководству:
PHP реализует надмножество JSON, как указано в оригинале »RFC 4627 — он также кодирует и декодирует скалярные типы и NULL. RFC 4627 поддерживает только эти значения, когда они вложены внутри массива или объекта. Хотя это дополнение соответствует расширенному определению «текста JSON» в новой версии RFC 7159 (целью которого является замещение RFC 4627) и « ECMA-404» , это может вызвать проблемы совместимости со старыми анализаторами JSON, которые строго придерживаются RFC 4627, когда кодируя одно скалярное значение.
Это означает, что, например, простая строка будет считаться допустимым объектом JSON в PHP:
$json = json_decode('"some string"', true);
var_dump($json, json_last_error_msg());
Выход:
string(11) "some string"
string(8) "No error"
Но простые строки, а не в массиве или объекте, не являются частью стандарта RFC 4627 . В результате такие онлайн-шашки, как JSLint , JSON Formatter & Validator (в режиме RFC 4627) дадут вам ошибку.
Для глубины рекурсии существует третий параметр $depth
(значение по умолчанию — 512
), что означает количество вложенных объектов внутри исходного объекта, подлежащего декодированию.
Существует четвертый параметр $options
. В настоящее время он принимает только одно значение: JSON_BIGINT_AS_STRING
. Поведение по умолчанию (которое оставляет эту опцию) заключается в том, чтобы отличать целые числа от float вместо строк.
Недействительные варианты с нижним регистром истинных, ложных и нулевых литералов больше не принимаются в качестве допустимого ввода.
Итак, этот пример:
var_dump(json_decode('tRue'), json_last_error_msg());
var_dump(json_decode('tRUe'), json_last_error_msg());
var_dump(json_decode('tRUE'), json_last_error_msg());
var_dump(json_decode('TRUe'), json_last_error_msg());
var_dump(json_decode('TRUE'), json_last_error_msg());
var_dump(json_decode('true'), json_last_error_msg());
До PHP 5.6:
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
bool(true)
string(8) "No error"
И после:
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
NULL
string(12) "Syntax error"
bool(true)
string(8) "No error"
Аналогичное поведение имеет место для false
и null
.
Обратите внимание, что json_decode()
возвращает NULL
если строка не может быть преобразована.
$json = "{'name': 'Jeff', 'age': 20 }" ; // invalid json
$person = json_decode($json);
echo $person->name; // Notice: Trying to get property of non-object: returns null
echo json_last_error();
# 4 (JSON_ERROR_SYNTAX)
echo json_last_error_msg();
# unexpected character
Небезопасно полагаться только на возвращаемое значение NULL
для обнаружения ошибок. Например, если строка JSON содержит ничего, кроме "null"
, json_decode()
вернет значение null
, даже если ошибка не возникла.
Кодирование строки JSON
Функция json_encode
преобразует массив PHP (или, начиная с PHP 5.4, объект, который реализует интерфейс JsonSerializable
) в строку, закодированную в JSON. Он возвращает строку с кодировкой JSON при успешном завершении или FALSE при сбое.
$array = [
'name' => 'Jeff',
'age' => 20,
'active' => true,
'colors' => ['red', 'blue'],
'values' => [0=>'foo', 3=>'bar'],
];
Во время кодирования строки данных типа PHP, integer и boolean преобразуются в эквивалент JSON. Ассоциативные массивы кодируются как объекты JSON, а при вызове с аргументами по умолчанию индексированные массивы кодируются как массивы JSON. (Если ключи массива не являются непрерывной числовой последовательностью, начиная с 0, в этом случае массив будет закодирован как объект JSON.)
echo json_encode($array);
Выход:
{"name":"Jeff","age":20,"active":true,"colors":["red","blue"],"values":{"0":"foo","3":"bar"}}
аргументы
Начиная с PHP 5.3, второй аргумент json_encode
является битовой маской, которая может быть одной или несколькими из следующих.
Как и в любой битовой маске, их можно комбинировать с двоичным оператором OR |
,
PHP 5.x 5.3
JSON_FORCE_OBJECT
Заставляет создать объект вместо массива
$array = ['Joel', 23, true, ['red', 'blue']];
echo json_encode($array);
echo json_encode($array, JSON_FORCE_OBJECT);
Выход:
["Joel",23,true,["red","blue"]]
{"0":"Joel","1":23,"2":true,"3":{"0":"red","1":"blue"}}
JSON_HEX_TAG
, JSON_HEX_AMP
, JSON_HEX_APOS
, JSON_HEX_QUOT
Обеспечивает следующие преобразования во время кодирования:
постоянная | вход | Выход |
---|---|---|
JSON_HEX_TAG |
< |
u003C |
JSON_HEX_TAG |
> |
u003E |
JSON_HEX_AMP |
& |
u0026 |
JSON_HEX_APOS |
' |
u0027 |
JSON_HEX_QUOT |
" |
u0022 |
$array = ["tag"=>"<>", "amp"=>"&", "apos"=>"'", "quot"=>"""];
echo json_encode($array);
echo json_encode($array, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
Выход:
{"tag":"<>","amp":"&","apos":"'","quot":"""}
{"tag":"u003Cu003E","amp":"u0026","apos":"u0027","quot":"u0022"}
PHP 5.x 5.3
JSON_NUMERIC_CHECK
Обеспечивает преобразование числовых строк в целые числа.
$array = ['23452', 23452];
echo json_encode($array);
echo json_encode($array, JSON_NUMERIC_CHECK);
Выход:
["23452",23452]
[23452,23452]
PHP 5.x 5.4
JSON_PRETTY_PRINT
Делает JSON легко читаемым
$array = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
echo json_encode($array);
echo json_encode($array, JSON_PRETTY_PRINT);
Выход:
{"a":1,"b":2,"c":3,"d":4}
{
"a": 1,
"b": 2,
"c": 3,
"d": 4
}
JSON_UNESCAPED_SLASHES
Включает неэкранированные /
косые черты на выходе
$array = ['filename' => 'example.txt', 'path' => '/full/path/to/file/'];
echo json_encode($array);
echo json_encode($array, JSON_UNESCAPED_SLASHES);
Выход:
{"filename":"example.txt","path":"/full/path/to/file"}
{"filename":"example.txt","path":"/full/path/to/file"}
JSON_UNESCAPED_UNICODE
Включает символы с кодировкой UTF8 в выводе вместо u
-encoded строк.
$blues = ["english"=>"blue", "norwegian"=>"blå", "german"=>"blau"];
echo json_encode($blues);
echo json_encode($blues, JSON_UNESCAPED_UNICODE);
Выход:
{"english":"blue","norwegian":"blu00e5","german":"blau"}
{"english":"blue","norwegian":"blå","german":"blau"}
PHP 5.x 5.5
JSON_PARTIAL_OUTPUT_ON_ERROR
Позволяет продолжить кодирование, если встречаются некоторые неприменимые значения.
$fp = fopen("foo.txt", "r");
$array = ["file"=>$fp, "name"=>"foo.txt"];
echo json_encode($array); // no output
echo json_encode($array, JSON_PARTIAL_OUTPUT_ON_ERROR);
Выход:
{"file":null,"name":"foo.txt"}
PHP 5.x 5.6
JSON_PRESERVE_ZERO_FRACTION
Обеспечивает, чтобы поплавки всегда кодировались как плавающие.
$array = [5.0, 5.5];
echo json_encode($array);
echo json_encode($array, JSON_PRESERVE_ZERO_FRACTION);
Выход:
[5,5.5]
[5.0,5.5]
PHP 7.x 7.1
JSON_UNESCAPED_LINE_TERMINATORS
При использовании с JSON_UNESCAPED_UNICODE
возвращается к поведению старых версий PHP и не выходит из символов U + 2028 LINE SEPARATOR и U + 2029 PARAPRAPH SEPARATOR. Хотя они действительны в JSON, эти символы недействительны в JavaScript, поэтому поведение по умолчанию JSON_UNESCAPED_UNICODE
было изменено в версии 7.1.
$array = ["line"=>"xe2x80xa8", "paragraph"=>"xe2x80xa9"];
echo json_encode($array, JSON_UNESCAPED_UNICODE);
echo json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_LINE_TERMINATORS);
Выход:
{"line":"u2028","paragraph":"u2029"}
{"line":"
","paragraph":"
"}
Отладка ошибок JSON
Когда json_encode
или json_decode
не удается проанализировать предоставленную строку, он вернет false
. Сам PHP не вызывает никаких ошибок или предупреждений, когда это происходит, бремя на пользователя заключается в использовании функций json_last_error () и json_last_error_msg (), чтобы проверить, произошла ли ошибка и действовать соответственно в вашем приложении (отладить ее, показать сообщение об ошибке , так далее.).
В следующем примере показана общая ошибка при работе с JSON, неспособность декодировать / кодировать строку JSON (например, из-за передачи плохой кодированной строки UTF-8) .
// An incorrectly formed JSON string
$jsonString = json_encode("{'Bad JSON':xB1x31}");
if (json_last_error() != JSON_ERROR_NONE) {
printf("JSON Error: %s", json_last_error_msg());
}
#> JSON Error: Malformed UTF-8 characters, possibly incorrectly encoded
json_last_error_msg
json_last_error_msg()
возвращает человекообразное сообщение о последней ошибке, возникшей при попытке кодирования / декодирования строки.
- Эта функция всегда вернет строку , даже если ошибка не возникла.
Строка по умолчанию без ошибок неNo Error
- Он вернет
false
если произошла какая-либо другая (неизвестная) ошибка - Будьте осторожны при использовании этого в циклах, поскольку json_last_error_msg будет переопределяться на каждой итерации.
Вы должны использовать эту функцию только для получения сообщения для отображения, а не для проверки в контрольных операторах.
// Don't do this:
if (json_last_error_msg()){} // always true (it's a string)
if (json_last_error_msg() != "No Error"){} // Bad practice
// Do this: (test the integer against one of the pre-defined constants)
if (json_last_error() != JSON_ERROR_NONE) {
// Use json_last_error_msg to display the message only, (not test against it)
printf("JSON Error: %s", json_last_error_msg());
}
Эта функция не существует до PHP 5.5. Вот реализация полиполнения:
if (!function_exists('json_last_error_msg')) {
function json_last_error_msg() {
static $ERRORS = array(
JSON_ERROR_NONE => 'No error',
JSON_ERROR_DEPTH => 'Maximum stack depth exceeded',
JSON_ERROR_STATE_MISMATCH => 'State mismatch (invalid or malformed JSON)',
JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded',
JSON_ERROR_SYNTAX => 'Syntax error',
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded'
);
$error = json_last_error();
return isset($ERRORS[$error]) ? $ERRORS[$error] : 'Unknown error';
}
}
json_last_error
json_last_error()
возвращает целое число, сопоставленное с одной из предварительно определенных констант, предоставляемых PHP.
постоянная | Имея в виду |
---|---|
JSON_ERROR_NONE |
Ошибка не произошла |
JSON_ERROR_DEPTH |
Максимальная глубина стека превышена |
JSON_ERROR_STATE_MISMATCH |
Недопустимый или некорректный JSON |
JSON_ERROR_CTRL_CHAR |
Ошибка контрольного символа, возможно, неправильно закодированная |
JSON_ERROR_SYNTAX |
Ошибка синтаксиса (с PHP 5.3.3) |
JSON_ERROR_UTF8 |
Малоформатные символы UTF-8, возможно, некорректно закодированные (начиная с PHP 5.5.0) |
JSON_ERROR_RECURSION |
Одна или несколько рекурсивных ссылок в кодируемом значении |
JSON_ERROR_INF_OR_NAN |
Один или несколько значений NAN или INF в кодируемом значении |
JSON_ERROR_UNSUPPORTED_TYPE |
Дано значение типа, который не может быть закодирован. |
Использование JsonSerializable в объекте
PHP 5.x 5.4
Когда вы создаете API REST, вам может потребоваться уменьшить информацию об объекте, который будет передан клиентскому приложению. С этой целью в этом примере показано, как использовать интерфейс JsonSerialiazble
.
В этом примере User
класса фактически расширяет объект модели DB гипотетической ORM.
class User extends Model implements JsonSerializable {
public $id;
public $name;
public $surname;
public $username;
public $password;
public $email;
public $date_created;
public $date_edit;
public $role;
public $status;
public function jsonSerialize() {
return [
'name' => $this->name,
'surname' => $this->surname,
'username' => $this->username
];
}
}
Добавьте реализацию JsonSerializable
в класс, предоставив метод jsonSerialize()
.
public function jsonSerialize()
Теперь в вашем контроллере приложения или скрипте при передаче объекта User в json_encode()
вы получите возвращаемый json-кодированный массив метода jsonSerialize()
вместо всего объекта.
json_encode($User);
Вернусь:
{"name":"John", "surname":"Doe", "username" : "TestJson"}
пример значений свойств.
Это уменьшит количество данных, возвращаемых конечной точкой RESTful, и позволит исключить свойства объекта из представления json.
Использование частных и защищенных свойств с помощью json_encode()
Чтобы избежать использования JsonSerializable, также можно использовать частные или защищенные свойства, чтобы скрыть информацию о классе из вывода json_encode()
. Затем классу не нужно реализовывать JsonSerializable.
Функция json_encode () будет кодировать только общедоступные свойства класса в JSON.
<?php
class User {
// private properties only within this class
private $id;
private $date_created;
private $date_edit;
// properties used in extended classes
protected $password;
protected $email;
protected $role;
protected $status;
// share these properties with the end user
public $name;
public $surname;
public $username;
// jsonSerialize() not needed here
}
$theUser = new User();
var_dump(json_encode($theUser));
Выход:
string(44) "{"name":null,"surname":null,"username":null}"
Заголовок json и возвращаемый ответ
Добавив заголовок с типом контента как JSON:
<?php
$result = array('menu1' => 'home', 'menu2' => 'code php', 'menu3' => 'about');
//return the json response :
header('Content-Type: application/json'); // <-- header declaration
echo json_encode($result, true); // <--- encode
exit();
Заголовок там, так что ваше приложение может обнаружить, какие данные были возвращены и как он должен справиться с этим.
Обратите внимание: заголовок содержимого представляет собой только информацию о типе возвращаемых данных.
Если вы используете UTF-8, вы можете использовать:
header("Content-Type: application/json;charset=utf-8");
Пример jQuery:
$.ajax({
url:'url_your_page_php_that_return_json'
}).done(function(data){
console.table('json ',data);
console.log('Menu1 : ', data.menu1);
});
From Get docs
Jump to:navigation, search
- « json_last_error_msg
- Judy »
json_last_error
(PHP 5 >= 5.3.0, PHP 7)
json_last_error — Returns the last error occurred
Description
json_last_error
(
) : int
Returns the last error (if any) occurred during the last JSON encoding/decoding,
which did not specify JSON_THROW_ON_ERROR
.
Parameters
This function has no parameters.
Return Values
Returns an integer, the value can be one of the following
constants:
Constant | Meaning | Availability |
---|---|---|
JSON_ERROR_NONE
|
No error has occurred | |
JSON_ERROR_DEPTH
|
The maximum stack depth has been exceeded | |
JSON_ERROR_STATE_MISMATCH
|
Invalid or malformed JSON | |
JSON_ERROR_CTRL_CHAR
|
Control character error, possibly incorrectly encoded | |
JSON_ERROR_SYNTAX
|
Syntax error | |
JSON_ERROR_UTF8
|
Malformed UTF-8 characters, possibly incorrectly encoded | PHP 5.3.3 |
JSON_ERROR_RECURSION
|
One or more recursive references in the value to be encoded | PHP 5.5.0 |
JSON_ERROR_INF_OR_NAN
|
One or more
|
PHP 5.5.0 |
JSON_ERROR_UNSUPPORTED_TYPE
|
A value of a type that cannot be encoded was given | PHP 5.5.0 |
JSON_ERROR_INVALID_PROPERTY_NAME
|
A property name that cannot be encoded was given | PHP 7.0.0 |
JSON_ERROR_UTF16
|
Malformed UTF-16 characters, possibly incorrectly encoded | PHP 7.0.0 |
Examples
Example #1 json_last_error() example
<?php// A valid json string$json[] = '{"Organization": "PHP Documentation Team"}';// An invalid json string which will cause an syntax // error, in this case we used ' instead of " for quotation$json[] = "{'Organization': 'PHP Documentation Team'}";foreach ($json as $string) { echo 'Decoding: ' . $string; json_decode($string); switch (json_last_error()) { case JSON_ERROR_NONE: echo ' - No errors'; break; case JSON_ERROR_DEPTH: echo ' - Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: echo ' - Syntax error, malformed JSON'; break; case JSON_ERROR_UTF8: echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: echo ' - Unknown error'; break; } echo PHP_EOL;}?>
The above example will output:
Decoding: {"Organization": "PHP Documentation Team"} - No errors Decoding: {'Organization': 'PHP Documentation Team'} - Syntax error, malformed JSON
Example #2 json_last_error() with json_encode()
<?php// An invalid UTF8 sequence$text = "xB1x31";$json = json_encode($text);$error = json_last_error();var_dump($json, $error === JSON_ERROR_UTF8);?>
The above example will output:
string(4) "null" bool(true)
‘Example #3 json_last_error() and JSON_THROW_ON_ERROR
‘
<?php// An invalid UTF8 sequence which causes JSON_ERROR_UTF8json_encode("xB1x31");// The following does not cause a JSON errorjson_encode('okay', JSON_THROW_ON_ERROR);// The global error state has not been changed by the former json_encode()var_dump(json_last_error() === JSON_ERROR_UTF8);?>
The above example will output:
See Also
- json_last_error_msg() — Returns the error string of the last json_encode() or json_decode() call
- json_decode() — Decodes a JSON string
- json_encode() — Returns the JSON representation of a value
(PHP 5 >= 5.3.0, PHP 7)
json_last_error — Returns the last error occurred
Description
int json_last_error
( void
)
Parameters
This function has no parameters.
Return Values
Returns an integer, the value can be one of the following
constants:
Constant | Meaning | Availability |
---|---|---|
JSON_ERROR_NONE |
No error has occurred | |
JSON_ERROR_DEPTH |
The maximum stack depth has been exceeded | |
JSON_ERROR_STATE_MISMATCH |
Invalid or malformed JSON | |
JSON_ERROR_CTRL_CHAR |
Control character error, possibly incorrectly encoded | |
JSON_ERROR_SYNTAX |
Syntax error | |
JSON_ERROR_UTF8 |
Malformed UTF-8 characters, possibly incorrectly encoded | PHP 5.3.3 |
JSON_ERROR_RECURSION |
One or more recursive references in the value to be encoded | PHP 5.5.0 |
JSON_ERROR_INF_OR_NAN |
One or moreNAN or INF values in the value to be encoded |
PHP 5.5.0 |
JSON_ERROR_UNSUPPORTED_TYPE |
A value of a type that cannot be encoded was given | PHP 5.5.0 |
Examples
Example #1 json_last_error() example
<?php
// A valid json string
$json[] = '{"Organization": "PHP Documentation Team"}';// An invalid json string which will cause an syntax
// error, in this case we used ' instead of " for quotation
$json[] = "{'Organization': 'PHP Documentation Team'}";
foreach (
$json as $string) {
echo 'Decoding: ' . $string;
json_decode($string);
switch (
json_last_error()) {
case JSON_ERROR_NONE:
echo ' - No errors';
break;
case JSON_ERROR_DEPTH:
echo ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_STATE_MISMATCH:
echo ' - Underflow or the modes mismatch';
break;
case JSON_ERROR_CTRL_CHAR:
echo ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
echo ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_UTF8:
echo ' - Malformed UTF-8 characters, possibly incorrectly encoded';
break;
default:
echo ' - Unknown error';
break;
}
echo
PHP_EOL;
}
?>
The above example will output:
Decoding: {"Organization": "PHP Documentation Team"} - No errors Decoding: {'Organization': 'PHP Documentation Team'} - Syntax error, malformed JSON
Example #2 json_last_error() with json_encode()
<?php
// An invalid UTF8 sequence
$text = "xB1x31";$json = json_encode($text);
$error = json_last_error();var_dump($json, $error === JSON_ERROR_UTF8);
?>
The above example will output:
string(4) "null" bool(true)
See Also
- json_last_error_msg() — Returns the error string of the last json_encode() or json_decode() call
- json_decode() — Decodes a JSON string
- json_encode() — Returns the JSON representation of a value
User Contributed Notes
jimmetry at gmail dot com
4 years ago
While this can obviously change between versions, the current error codes are as follows:
0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8
I'm only posting these for people who may be trying to understand why specific JSON files are not being decoded. Please do not hard-code these numbers into an error handler routine.
praveenscience at gmail dot com
1 year ago
I used this simple script, flicked from StackOverflow to escape from the function failing:
<?php
function utf8ize($d) {
if (is_array($d)) {
foreach ($d as $k => $v) {
$d[$k] = utf8ize($v);
}
} else if (is_string ($d)) {
return utf8_encode($d);
}
return $d;
}
?>
Cheers,
Praveen Kumar!
hemono at gmail dot com
6 months ago
when json_decode a empty string, PHP7 will trigger an Syntax error:
<?php
json_decode("");
var_dump(json_last_error(), json_last_error_msg());// PHP 7
int(4)
string(12) "Syntax error"// PHP 5
int(0)
string(8) "No error"
williamprogphp at yahoo dot com dot br
2 years ago
This is a quite simple and functional trick to validate JSON's strings.
<?phpfunction json_validate($string) {
if (is_string($string)) {
@json_decode($string);
return (json_last_error() === JSON_ERROR_NONE);
}
return false;
}
echo (json_validate('{"test": "valid JSON"}') ? "It's a JSON" : "NOT is a JSON"); // prints 'It's a JSON'
echo (json_validate('{test: valid JSON}') ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to missing quotes
echo (json_validate(array()) ? "It's a JSON" : "NOT is a JSON"); // prints 'NOT is a JSON' due to a non-string argument
?>
Cheers
lior at mytopia dot com
7 years ago
For those of you who prefer a more object oriented approach (as I do), here is a fairly simple wrapper that handles errors using exceptions:
<?phpclass JSON
{
public static function Encode($obj)
{
return json_encode($obj);
}
public static function
Decode($json, $toAssoc = false)
{
$result = json_decode($json, $toAssoc);
switch(json_last_error())
{
case JSON_ERROR_DEPTH:
$error = ' - Maximum stack depth exceeded';
break;
case JSON_ERROR_CTRL_CHAR:
$error = ' - Unexpected control character found';
break;
case JSON_ERROR_SYNTAX:
$error = ' - Syntax error, malformed JSON';
break;
case JSON_ERROR_NONE:
default:
$error = '';
}
if (!empty($error))
throw new Exception('JSON Error: '.$error);
return
$result;
}
}?>