Json last error msg syntax error

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

json_last_errorВозвращает последнюю ошибку

Описание

json_last_error(): int

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает целочисленное значение, которое может быть одной из следующих
констант:

Коды ошибок JSON

Константа Значение Доступность
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

Константа Значение Доступность
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 Функции

Содержание

  1. PHP JSON
  2. Вступление
  3. Синтаксис
  4. параметры
  5. замечания
  6. Декодирование строки JSON
  7. Кодирование строки JSON
  8. аргументы
  9. JSON_FORCE_OBJECT
  10. JSON_HEX_TAG , JSON_HEX_AMP , JSON_HEX_APOS , JSON_HEX_QUOT
  11. JSON_NUMERIC_CHECK
  12. JSON_PRETTY_PRINT
  13. JSON_UNESCAPED_SLASHES
  14. JSON_UNESCAPED_UNICODE
  15. JSON_PARTIAL_OUTPUT_ON_ERROR
  16. JSON_PRESERVE_ZERO_FRACTION
  17. JSON_UNESCAPED_LINE_TERMINATORS
  18. Отладка ошибок JSON
  19. json_last_error_msg
  20. json_last_error
  21. Использование JsonSerializable в объекте
  22. пример значений свойств.
  23. Использование частных и защищенных свойств с помощью json_encode()
  24. Выход:
  25. Заголовок json и возвращаемый ответ
  26. PHP: json_encode / json_decode error handling.
  27. Парсинг многоэтажного 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

Константа Значение Доступность
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_errorReturns 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:

JSON error codes

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

NAN
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
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_errorReturns 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:

JSON error codes

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
NAN
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;
    }
}
?>


Понравилась статья? Поделить с друзьями:
  • Json error битрикс
  • Json error utf8
  • Json error unknown
  • Json error syntax error 4 100
  • Json error status 200