Json last error msg: примеры (PHP)
json_last_error_msg: stringОсновные сведения о функции
Функция json_last_error_msg() возвращает строковое описание последней ошибки, произошедшей при работе с JSON.
Функция применяется после вызова json_decode() или json_encode() для получения текстового описания ошибки вместо числового кода, который возвращает json_last_error().
Функция не принимает никаких параметров.
Простые примеры использования
<?
$json = '{"name": "John", age: 30}';
$data = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_last_error_msg();
}
?>Syntax error
<?
class User {
public $friend;
}
$user1 = new User();
$user2 = new User();
$user1->friend = $user2;
$user2->friend = $user1;
echo json_encode($user1);
echo json_last_error_msg();
?>Recursion detected
<?
$json = '{"title": "Тест"}';
$data = json_decode($json);
echo json_last_error_msg();
?>No error
Похожие функции в PHP
Возвращает код последней ошибки в виде целого числа. Используется вместе с константами JSON_ERROR_*. Полезна, когда нужно выполнить разную логику в зависимости от типа ошибки.
В PHP 7.3+ можно использовать этот флаг, чтобы функция выбрасывала исключение JsonException вместо необходимости проверять ошибки вручную.
json_last_error_msg() подходит для быстрого получения читаемого описания. json_last_error() используют при программной обработке разных типов ошибок. JSON_THROW_ON_ERROR предпочтительнее в современном коде с обработкой исключений.
Типичные ошибки
<?
// Не было вызовов json_decode/json_encode
$msg = json_last_error_msg();
echo $msg;
?>No error
<?
$data = ['level1' => ['level2' => ['level3' => 'value']]];
$json = json_encode($data, 0, 2); // Глубина 2
if (json_last_error() !== JSON_ERROR_NONE) {
echo json_last_error_msg();
}
?>Maximum stack depth exceeded
<?
$resource = fopen('test.txt', 'r');
$data = ['file' => $resource];
echo json_encode($data);
echo json_last_error_msg();
?>Inf and NaN cannot be JSON encoded
Изменения в версиях PHP
Функция теперь всегда возвращает строку "No error" вместо пустой строки, когда ошибок нет. Это улучшение обратной совместимости.
Появилась возможность использовать JSON_THROW_ON_ERROR с json_decode() и json_encode(), что изменило предпочтительный способ обработки ошибок JSON.
Расширенные примеры
<?
function safeJsonDecode(string $json, bool $assoc = false) {
$data = json_decode($json, $assoc);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new InvalidArgumentException(
'JSON decode error: ' . json_last_error_msg()
);
}
return $data;
}
try {
$result = safeJsonDecode('{"broken": json}');
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}
?>JSON decode error: Syntax error
<?
function decodeWithLogging(string $json) {
$data = json_decode($json);
if (json_last_error() !== JSON_ERROR_NONE) {
error_log(
'JSON error: ' . json_last_error_msg() .
' Input: ' . substr($json, 0, 100)
);
return null;
}
return $data;
}
$result = decodeWithLogging('{"test": "value"}');
?>// В логах ошибок не будет, так как JSON валиден
<?
$data = [NAN, INF];
$json = json_encode($data);
if (json_last_error() === JSON_ERROR_INF_OR_NAN) {
// Заменяем проблемные значения
$cleaned = array_map(function($value) {
return is_nan($value) || is_infinite($value) ? null : $value;
}, $data);
$json = json_encode($cleaned);
}
echo $json;
?>[null,null]
<?
$data = ['ключ' => 'значение', 'test' => 'value'];
// Пытаемся закодировать с флагом JSON_THROW_ON_ERROR
$json = json_encode($data, JSON_THROW_ON_ERROR);
echo 'Успех: ' . $json . "\n";
// С флагом JSON_UNESCAPED_UNICODE
$json = json_encode($data, JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR);
echo 'С Unicode: ' . $json;
?>Успех: {"\u043a\u043b\u044e\u0447":"\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435","test":"value"}
С Unicode: {"ключ":"значение","test":"value"}Аналоги в других языках
Json last error msg в Python
import json
try:
data = json.loads('{invalid}')
except json.JSONDecodeError as e:
print(e.msg) # "Expecting property name"Expecting property name
Json last error msg в Javascript
try {
JSON.parse('{invalid}');
} catch (e) {
console.log(e.message);
}Unexpected token i in JSON at position 1
Json last error msg в MySQL
SELECT JSON_VALID('{invalid}'); -- Возвращает 0
-- Конкретное сообщение получают через обработку ошибок0
В Python и JavaScript используется механизм исключений, тогда как в PHP нужен отдельный вызов функции для получения ошибки. В PHP 8 можно использовать оба подхода.