- json_last_error
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- Возврат JSON из PHP-скрипта
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 3
- Ответ 4
- Ответ 5
- 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 и возвращаемый ответ
json_last_error
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
json_last_error — Возвращает последнюю ошибку
Описание
Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих констант:
Константа | Значение | Доступность |
---|---|---|
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()
// Неверная 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;
>
Результат выполнения данного примера:
Пример #2 Совместное использование json_last_error() и json_encode()
// Некорректная последовательность UTF8
$text = «\xB1\x31» ;
$json = json_encode ( $text );
$error = json_last_error ();
var_dump ( $json , $error === JSON_ERROR_UTF8 );
?>
Результат выполнения данного примера:
Пример #3 json_last_error() и JSON_THROW_ON_ERROR
// Некорректная последовательность UTF8, вызывающая JSON_ERROR_UTF8
json_encode ( «\xB1\x31» );
// Не вызовет ошибки 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 из PHP-скрипта
Я хочу вернуть JSON из скрипта PHP. Надо ли устанавливать Content-Type заголовок?
Ответ 1
Хотя обычно все работает и без этого, но , согласно спецификации, вам обязательно необходимо устанавливать Content-Type заголовок:
$data = /** все, что вы сериализуете **/;
Если я не использую конкретный фреймворк, я обычно разрешаю некоторым параметрам запроса изменять поведение вывода. Как правило, для быстрого устранения неполадок может быть полезно не отправлять заголовок, а использовать print_r и другую полезную нагрузку данных (хотя в большинстве случаев в этом нет необходимости).
Ответ 2
Полный фрагмент допустимого и понятного PHP-кода, возвращающего JSON, выглядит так:
// декодируем в JSON массив: [«a»,»b»,»c»]
$data = [ ‘name’ => ‘God’, ‘age’ => -1 ];
// декодируем в JSON объект:
echo json_encode( $data );
Ответ 3
Согласно руководству по методу json_encode, он может возвращать нестроковый ответ ( false ): Возвращает строку в кодировке JSON в случае успеха или FALSE, если ошибка .
Когда это произойдет, echo json_encode($data) будет выведена пустая строка, которая является недопустимым JSON .
json_encode, например, завершится с ошибкой (и вернет false ), если его аргумент содержит строку, отличную от UTF-8.
Это состояние ошибки должно быть зафиксировано в PHP, например, следующим образом:
// Соберите все необходимое в переменную $data.
// Избегайте эха пустой строки (которая является недействительным JSON)
$json = json_encode([«jsonError» => json_last_error_msg()]);
// Этого не должно быть, но мы идем до конца:
// Установка кода статуса ответа HTTP: 500 — Внутренняя ошибка сервера http_response_code(500);
Тогда принимающая сторона, конечно же, должна знать, что наличие свойства jsonError указывает на состояние ошибки, которое она должна обрабатывать соответствующим образом.
В производственном режиме может быть лучше отправлять клиенту только общий статус ошибки и регистрировать более конкретные сообщения об ошибках для дальнейшего исследования.
Дополнительные сведения о работе с ошибками JSON см. в документации PHP .
Ответ 3
Также хорошо установить безопасность доступа — просто замените «*» на домен, к которому вы хотите получить доступ.
Ответ 4
На этот вопрос было много ответов, но ни один из них не охватывает весь процесс возврата чистого JSON со всем необходимым для предотвращения искажения ответа JSON.
function returnJsonHttpResponse($success, $data) <
// удалите любую строку, которая может создать недопустимый JSON
// такие как PHP Notice, Warning, logs.
// это очистит все ранее добавленные заголовки, чтобы начать с чистого листа
// Установите тип содержимого JSON и charset
// (charset может быть установлен на что-то другое)
header(«Content-type: application/json; charset=utf-8»);
// Установите код ответа HTTP, 2xx = SUCCESS,
// любой другой будет ошибкой, обратитесь к документации HTTP
// кодируйте ваш объект или массив PHP в строку JSON.
// stdClass или массив
Ответ 5
Простая функция для возврата ответа JSON с кодом состояния HTTP .
function json_response($data=null, $httpStatus=200) <
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
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, вы можете использовать: