Json last error msg: примеры (PHP)

Работа с ошибками JSON в PHP: функция json_last_error_msg
Раздел: JSON
json_last_error_msg: string

Основные сведения о функции

Функция json_last_error_msg() возвращает строковое описание последней ошибки, произошедшей при работе с JSON.

Когда используется

Функция применяется после вызова json_decode() или json_encode() для получения текстового описания ошибки вместо числового кода, который возвращает json_last_error().

Аргументы функции

Функция не принимает никаких параметров.

Простые примеры использования

Ошибка декодирования невалидного JSON
<?
$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_*. Полезна, когда нужно выполнить разную логику в зависимости от типа ошибки.

json_decode() с флагом JSON_THROW_ON_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

PHP 8.0

Функция теперь всегда возвращает строку "No error" вместо пустой строки, когда ошибок нет. Это улучшение обратной совместимости.

PHP 7.3

Появилась возможность использовать JSON_THROW_ON_ERROR с json_decode() и json_encode(), что изменило предпочтительный способ обработки ошибок JSON.

Расширенные примеры

Обработка ошибок в пользовательской функции
Пример php
<?
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
Логирование ошибок с контекстом
Пример php
<?
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 валиден
Обработка специфических ошибок кодирования
Пример php
<?
$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]
Использование с флагами кодирования
Пример php
<?
$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 можно использовать оба подхода.

PHP json_last_error_msg function comments

En
Json last error msg Returns the error string of the last json_encode() or json_decode() call