Json error none

The constants below are defined by this extension, and will only be available when the extension has either been compiled into PHP or dynamically loaded at runtime.

The constants below are defined by this extension, and
will only be available when the extension has either
been compiled into PHP or dynamically loaded at runtime.

The following constants indicate the type of error returned by
json_last_error() or stored as the code
of a JsonException.

JSON_ERROR_NONE
(int)


No error has occurred.

JSON_ERROR_DEPTH
(int)


The maximum stack depth has been exceeded.

JSON_ERROR_STATE_MISMATCH
(int)


Occurs with underflow or with the modes mismatch.

JSON_ERROR_CTRL_CHAR
(int)


Control character error, possibly incorrectly encoded.

JSON_ERROR_SYNTAX
(int)


Syntax error.

JSON_ERROR_UTF8
(int)


Malformed UTF-8 characters, possibly incorrectly encoded.

JSON_ERROR_RECURSION
(int)


The object or array passed to json_encode() include
recursive references and cannot be encoded.
If the JSON_PARTIAL_OUTPUT_ON_ERROR option was
given, null will be encoded in the place of the recursive reference.

JSON_ERROR_INF_OR_NAN
(int)


The value passed to json_encode() includes either
NAN
or INF.
If the JSON_PARTIAL_OUTPUT_ON_ERROR option was
given, 0 will be encoded in the place of these
special numbers.

JSON_ERROR_UNSUPPORTED_TYPE
(int)


A value of an unsupported type was given to
json_encode(), such as a resource.
If the JSON_PARTIAL_OUTPUT_ON_ERROR option was
given, null will be encoded in the place of the unsupported value.

JSON_ERROR_INVALID_PROPERTY_NAME
(int)


A key starting with u0000 character was in the string passed to
json_decode() when decoding a JSON object into a PHP
object.

JSON_ERROR_UTF16
(int)


Single unpaired UTF-16 surrogate in unicode escape contained in the
JSON string passed to json_decode().

The following constants can be combined to form options for
json_decode().

JSON_BIGINT_AS_STRING
(int)


Decodes large integers as their original string value.

JSON_OBJECT_AS_ARRAY
(int)


Decodes JSON objects as PHP array. This option can be added automatically
by calling json_decode() with the second parameter
equal to true.

The following constants can be combined to form options for
json_encode().

JSON_HEX_TAG
(int)


All < and > are converted to u003C and u003E.

JSON_HEX_AMP
(int)


All & are converted to u0026.

JSON_HEX_APOS
(int)


All ‘ are converted to u0027.

JSON_HEX_QUOT
(int)


All » are converted to u0022.

JSON_FORCE_OBJECT
(int)


Outputs an object rather than an array when a non-associative array is
used. Especially useful when the recipient of the output is expecting
an object and the array is empty.

JSON_NUMERIC_CHECK
(int)


Encodes numeric strings as numbers.

JSON_PRETTY_PRINT
(int)


Use whitespace in returned data to format it.

JSON_UNESCAPED_SLASHES
(int)


Don’t escape /.

JSON_UNESCAPED_UNICODE
(int)


Encode multibyte Unicode characters literally (default is to escape as
uXXXX).

JSON_PARTIAL_OUTPUT_ON_ERROR
(int)


Substitute some unencodable values instead of failing.

JSON_PRESERVE_ZERO_FRACTION
(int)


Ensures that float values are always encoded as a float value.

JSON_UNESCAPED_LINE_TERMINATORS
(int)


The line terminators are kept unescaped when
JSON_UNESCAPED_UNICODE is supplied. It uses the same
behaviour as it was before PHP 7.1 without this constant.
Available as of PHP 7.1.0.

The following constants can be combined to form options for
json_decode() and json_encode().

JSON_INVALID_UTF8_IGNORE
(int)


Ignore invalid UTF-8 characters.
Available as of PHP 7.2.0.

JSON_INVALID_UTF8_SUBSTITUTE
(int)


Convert invalid UTF-8 characters to xfffd
(Unicode Character ‘REPLACEMENT CHARACTER’)
Available as of PHP 7.2.0.

JSON_THROW_ON_ERROR
(int)


Throws JsonException if an error occurs instead
of setting the global error state that is retrieved with
json_last_error() and json_last_error_msg().
JSON_PARTIAL_OUTPUT_ON_ERROR takes precedence over
JSON_THROW_ON_ERROR.
Available as of PHP 7.3.0.

majid4466 at gmail dot com

6 years ago


To get a really clean json string use these three constants like so:

<?php
$array
= ['€', 'http://example.com/some/cool/page', '337'];
$bad   = json_encode($array);
$good  = json_encode($arrayJSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);// $bad would be  ["u20ac","http://example.com/some/cool/page","337"]
// $good would be ["€","http://example.com/some/cool/page",337]
?>


Yzmir Ramirez

8 years ago


If you curious of the numeric values of the constants, as of JSON 1.2.1, the constants have the following values (not that you should use the numbers directly):

JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256

JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3

JSON_ERROR_SYNTAX => 4

JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1

JSON_BIGINT_AS_STRING => 2


nikospapoutsis

6 months ago


Be EXTREMELY cautious when using the code majid4466 at gmail dot com provided, or JSON_NUMERIC_CHECK in general.

For example, in php 7.4 and 8.1 with precision: 14 and serialize_precision: -1 we get:

<?php
$array
= ['€', 55.6666666666666666, 'http://example.com/some/cool/page', '000337', '55.6666666666666666'];
echo
$case1 = json_encode($array);
echo
$case2 = json_encode($arrayJSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
echo
$case3 = json_encode($arrayJSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

[

"u20ac",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// in $case1, both euro sign and the url change but we also lost a digit in our unquoted float (due to precision)["€",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// in $case2, both euro sign and the url stay exactly the same but we still lost a digit in our unquoted float (due to precision)["€",55.666666666666664,"http://example.com/some/cool/page",337,55.666666666666664]
// in $case3, we once again keep euro sign and the url intact but this time not only our unquoted float lost a digit
// but the same happened to our quoted float and the number/string lost its leading zeros too
Also, note that in php 5.x you will probably get some different but equally wrong results as default values may be different and some functions have changed internally as well.


ASchmidt at Anamera dot net

4 years ago


In a multi-level array, JSON_FORCE_OBJECT will encode ALL nested numeric arrays as objects.

If your concern was ONLY the first-level array (e.g., to make it suitable as a MySQL JSON column), you could just cast your first-level array to object, e.g.:

<?php
$json
= json_encode( (object) $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Or, if you have large arrays and are concerned about the overhead of object casting, you could append a "null" value beyond the size of the array, which will force the array to become associative:

<?php
$beyond
= count( $array ) + 1;
if ( !
array_key_exists( $beyond, $array) )
    
$array[ $beyond ] = NULL;
$json = json_encode( $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Of course, your later code has to treat an element with a "NULL" value the same as "!isset()", if it iterates the array.


JuanP

7 years ago


Updated format values list:

    JSON_HEX_TAG => 1
    JSON_HEX_AMP => 2
    JSON_HEX_APOS => 4
    JSON_HEX_QUOT => 8
    JSON_FORCE_OBJECT => 16
    JSON_NUMERIC_CHECK => 32
    JSON_UNESCAPED_SLASHES => 64
    JSON_PRETTY_PRINT => 128
    JSON_UNESCAPED_UNICODE => 256
    JSON_PARTIAL_OUTPUT_ON_ERROR => 512
    JSON_PRESERVE_ZERO_FRACTION => 1024


Anonymous

4 years ago


flags JSON_NUMERIC_CHECK and JSON_PRESERVE_ZERO_FRACTION are broken in php 7+ — json_encode((float)8.8) returns "8.8000000000000007", and json_encode((float)8.8, JSON_NUMERIC_CHECK) and json_encode((float)8.8, JSON_PRESERVE_ZERO_FRACTION) return "8.8000000000000007" too.

the only way to fix this is setting "serialize_precision = -1" in php.ini


on5wis at mac dot com

7 years ago


since json_encode expects a UTF-8 string there is no need to encode the € symbol.

I suggest you try to echo : json_encode('€');
It gives: "u20ac"
I'm running PHP 5.6.5 on the CLI, on MacOS X 10.10


(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


Вернуться к: JSON

Перечисленные ниже константы определены данным расширением и могут быть
доступны только в том случае, если PHP был собран с
поддержкой этого расширения или же в том случае, если
данное расширение было подгружено во время выполнения.

Следующие константы указывают на тип ошибки, возвращенной функцией
json_last_error().

JSON_ERROR_NONE
(integer)


Не произошло никаких ошибок.
Доступна начиная с PHP 5.3.0.

JSON_ERROR_DEPTH
(integer)


Была превышена максимальная глубина стека.
Доступна начиная с PHP 5.3.0.

JSON_ERROR_STATE_MISMATCH
(integer)


Неверный или поврежденный JSON.
Доступна начиная с PHP 5.3.0.

JSON_ERROR_CTRL_CHAR
(integer)


Ошибка управляющих символов, вероятно из-за неверного кодирования.
Доступна начиная с PHP 5.3.0.

JSON_ERROR_SYNTAX
(integer)


Синтаксическая ошибка.
Доступна начиная с PHP 5.3.0.

JSON_ERROR_UTF8
(integer)


Поврежденные символы UTF-8, вероятно, из-за неверного кодирования.
Эта константа стала доступна начиная с PHP 5.3.3.

JSON_ERROR_RECURSION
(integer)

Объект или массив, переданный в функцию json_encode() включает
рекурсивные ссылки и не может быть закодирован.
Если была передана опция JSON_PARTIAL_OUTPUT_ON_ERROR, то
на месте рекурсивных ссылок будет выведен NULL.

Эта константа стала доступна начиная с PHP 5.5.0.

JSON_ERROR_INF_OR_NAN
(integer)

Значение, переданное в функцию json_encode() включает либо
NAN,
либо INF.
Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR,
то вместо указанных особых значений будет выведен 0.

Эта константа стала доступна начиная с PHP 5.5.0.

JSON_ERROR_UNSUPPORTED_TYPE
(integer)

В функцию json_encode() было передано значение
неподдерживаемого типа, например, resource.
Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR,
то вместо неподдерживаемого значения будет выводиться NULL.

Эта константа стала доступна начиная с PHP 5.5.0.

Следующие константы можно комбинировать для использования в
json_encode().

JSON_HEX_TAG
(integer)


Все < и > кодируются в u003C и u003E.
Доступна начиная с PHP 5.3.0.

JSON_HEX_AMP
(integer)


Все & кодируются в u0026.
Доступна начиная с PHP 5.3.0.

JSON_HEX_APOS
(integer)


Все символы ‘ кодируются в u0027.
Доступна начиная с PHP 5.3.0.

JSON_HEX_QUOT
(integer)


Все символы » кодируются в u0022.
Доступна начиная с PHP 5.3.0.

JSON_FORCE_OBJECT
(integer)


Выдавать объект вместо массива при использовании неассоциативного
массива. Это полезно, когда принимающая программа или код ожидают
объект или же массив пуст.
Доступна начиная с PHP 5.3.0.

JSON_NUMERIC_CHECK
(integer)


Кодирование строк, содержащих числа, как
числа. Доступна начиная с PHP 5.3.3.

JSON_BIGINT_AS_STRING
(integer)


Кодирует большие целые числа в виде их строковых эквивалентов.
Доступна начиная с PHP 5.4.0.

JSON_PRETTY_PRINT
(integer)


Использовать пробельные символы в возвращаемых данных
для их форматирования. Доступна начиная с PHP 5.4.0.

JSON_UNESCAPED_SLASHES
(integer)


Не экранировать /.
Доступна начиная с PHP 5.4.0.

JSON_UNESCAPED_UNICODE
(integer)


Не кодировать многобайтные символы Unicode (по умолчанию они кодируются как uXXXX).
Доступна начиная с PHP 5.4.0.

Вернуться к: JSON

JSON (JavaScript Object Notation) – текстовый формат обмена данными, основанный на JavaScript, который представляет собой набор пар {ключ: значение}. Значение может быть массивом, числом, строкой и булевым значением.

В PHP поддержка JSON появилась с версии 5.2.0 и работает только с кодировкой UTF-8.

1

Кодирование

json_encode($value, $options) – кодирует массив или объект в JSON.

$array = array(
	'1' => 'Значение 1', 
	'2' => 'Значение 2', 
	'3' => 'Значение 3', 
	'4' => 'Значение 4', 
	'5' => 'Значение 5'
);

$json = json_encode($array);
echo $json;

PHP

{"1":"u0417u043du0430u0447u0435u043du0438u0435 1","2":"u0417u043du0430u0447u0435u043du0438u0435 2","3":"u0417u043du0430u0447u0435u043du0438u0435 3","4":"u0417u043du0430u0447u0435u043du0438u0435 4","5":"u0417u043du0430u0447u0435u043du0438u0435 5"}

Как видно кириллица кодируется, исправляется это добавлением опции JSON_UNESCAPED_UNICODE.

$json = json_encode($array, JSON_UNESCAPED_UNICODE);
echo $json;

PHP

{"1":"Значение 1","2":"Значение 2","3":"Значение 3","4":"Значение 4","5":"Значение 5"}

Далее такую строку можно сохранить в файл, или отдать в браузер, например при AJAX запросах.

header('Content-Type: application/json');
echo $json;
exit();

PHP

2

Декодирование

Функция json_decode($json) преобразует строку в объект:

$json = '{"1":"Значение 1","2":"Значение 2","3":"Значение 3","4":"Значение 4","5":"Значение 5"}';
$array = json_decode($json);
print_r($array);

PHP

stdClass Object
(
    [1] => Значение 1
    [2] => Значение 2
    [3] => Значение 3
    [4] => Значение 4
    [5] => Значение 5
)

Если добавить вторым аргументом true, то произойдёт преобразование в массив:

$json = '{"1":"Значение 1","2":"Значение 2","3":"Значение 3","4":"Значение 4","5":"Значение 5"}';
$array = json_decode($json, true);
print_r($array);

PHP

Array
(
    [1] => Значение 1
    [2] => Значение 2
    [3] => Значение 3
    [4] => Значение 4
    [5] => Значение 5
)

3

Получение ошибок и их исправление

json_decode() возвращает NULL, если в объекте есть ошибки, посмотреть их можно с помощью функции json_last_error():

$json = '{"1:"Значение 1"}';
$array = json_decode($json, true);

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

PHP

Посмотреть значения констант JSON:

$constants = get_defined_constants(true);
foreach ($constants['json'] as $name => $value) {
	echo $name . ': ' . $value . '<br>';
}

PHP

JSON_HEX_TAG: 1
JSON_HEX_AMP: 2
JSON_HEX_APOS: 4
JSON_HEX_QUOT: 8
JSON_FORCE_OBJECT: 16
JSON_NUMERIC_CHECK: 32
JSON_UNESCAPED_SLASHES: 64
JSON_PRETTY_PRINT: 128
JSON_UNESCAPED_UNICODE: 256
JSON_PARTIAL_OUTPUT_ON_ERROR: 512
JSON_PRESERVE_ZERO_FRACTION: 1024
JSON_UNESCAPED_LINE_TERMINATORS: 2048
JSON_OBJECT_AS_ARRAY: 1
JSON_BIGINT_AS_STRING: 2
JSON_ERROR_NONE: 0
JSON_ERROR_DEPTH: 1
JSON_ERROR_STATE_MISMATCH: 2
JSON_ERROR_CTRL_CHAR: 3
JSON_ERROR_SYNTAX: 4
JSON_ERROR_UTF8: 5
JSON_ERROR_RECURSION: 6
JSON_ERROR_INF_OR_NAN: 7
JSON_ERROR_UNSUPPORTED_TYPE: 8
JSON_ERROR_INVALID_PROPERTY_NAME: 9
JSON_ERROR_UTF16: 10

Если вы хотите распарсить JS объект из HTML страницы или файла, то скорее всего json_decode вернет ошибку т.к. в коде будут управляющие символы или BOM. Удалить их можно следующим образом:

$json = '{...}';

// Удаление управляющих символов
for ($i = 0; $i <= 31; ++$i) { 
	$json = str_replace(chr($i), '', $json); 
}

// Удаление символа Delete
$json = str_replace(chr(127), '', $json);

// Удаление BOM
if (0 === strpos(bin2hex($json), 'efbbbf')) {
   $json = substr($json, 3);
}

$res = json_decode($json, true);
print_r($res);

PHP

4

HTTP-запросы в формате JSON

Некоторые сервисы требуют чтобы запросы к ним осуществлялись в формате JSON, такой запрос можно сформировать в CURL:

$data = array(
	'name' => 'snipp.ru'
	'text' => 'Отправка сообщения',
);

$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 	
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$res = curl_exec($ch);
curl_close($ch);

PHP

А также могут обратится к вашим скриптам в таком формате, чтение JSON запроса.

$data = file_get_contents('php://input');
$data = json_decode($data, true);

PHP

Предопределённые константы

Перечисленные ниже константы определены данным модулем и могут быть доступны только в том случае, если PHP был собран с поддержкой этого модуля или же в том случае, если данный модуль был динамически загружен во время выполнения.

Следующие константы указывают на тип ошибки, возвращённой функцией
json_last_error() или хранящейся, как code
в JsonException.

JSON_ERROR_NONE
(int)


Не произошло никаких ошибок.

JSON_ERROR_DEPTH
(int)


Была превышена максимальная глубина стека.

JSON_ERROR_STATE_MISMATCH
(int)


Неверный или повреждённый JSON.

JSON_ERROR_CTRL_CHAR
(int)


Ошибка управляющих символов, вероятно, из-за неверного кодирования.

JSON_ERROR_SYNTAX
(int)


Синтаксическая ошибка.

JSON_ERROR_UTF8
(int)


Повреждённые символы UTF-8, вероятно, из-за неверного кодирования.

JSON_ERROR_RECURSION
(int)


Объект или массив, переданный в функцию json_encode() включает
рекурсивные ссылки и не может быть закодирован.
Если была передана опция JSON_PARTIAL_OUTPUT_ON_ERROR, то
на месте рекурсивных ссылок будет выведен null.

JSON_ERROR_INF_OR_NAN
(int)


Значение, переданное в функцию json_encode(), включает либо
NAN,
либо INF.
Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR,
то вместо указанных особых значений будет выведен 0.

JSON_ERROR_UNSUPPORTED_TYPE
(int)


В функцию json_encode() было передано значение
неподдерживаемого типа, например, resource.
Если была указана константа JSON_PARTIAL_OUTPUT_ON_ERROR,
то вместо неподдерживаемого значения будет выводиться null.

JSON_ERROR_INVALID_PROPERTY_NAME
(int)


В строке переданной в json_decode() был ключ, начинающийся с
символа u0000.

JSON_ERROR_UTF16
(int)


Один непарный суррогат UTF-16 в экранированной последовательности Unicode в
строке JSON, переданной в json_decode().

Можно комбинировать следующие константы для передачи в
json_decode().

JSON_BIGINT_AS_STRING
(int)


Декодирует большие целые числа в качестве исходного значения строки.

JSON_OBJECT_AS_ARRAY
(int)


Преобразует объекты JSON в массив PHP. Эта опция может быть задана автоматически,
если вызвать json_decode() указав вторым параметром true.

Следующие константы можно комбинировать для использования в
json_encode().

JSON_HEX_TAG
(int)


Все < и > кодируются в u003C и u003E.

JSON_HEX_AMP
(int)


Все & кодируются в u0026.

JSON_HEX_APOS
(int)


Все символы ‘ кодируются в u0027.

JSON_HEX_QUOT
(int)


Все символы » кодируются в u0022.

JSON_FORCE_OBJECT
(int)


Выдавать объект вместо массива при использовании неассоциативного
массива. Это полезно, когда принимающая программа или код ожидают
объект, а массив пуст.

JSON_NUMERIC_CHECK
(int)


Кодирование строк, содержащих числа, как
числа.

JSON_PRETTY_PRINT
(int)


Использовать пробельные символы в возвращаемых данных
для их форматирования.

JSON_UNESCAPED_SLASHES
(int)


Не экранировать /.

JSON_UNESCAPED_UNICODE
(int)


Не кодировать многобайтовые символы Unicode (по умолчанию они кодируются как uXXXX).

JSON_PARTIAL_OUTPUT_ON_ERROR
(int)


Позволяет избежать возникновения ошибок при использовании функции
json_encode. Осуществляет подстановку значений
по умолчанию вместо некодируемых.

JSON_PRESERVE_ZERO_FRACTION
(int)


Гарантирует, что значение типа float будет преобразовано
именно в значение типа float в случае, если дробная часть равна 0.

JSON_UNESCAPED_LINE_TERMINATORS
(int)


Символы конца строки не будут экранироваться, если задана константа
JSON_UNESCAPED_UNICODE. Поведение будет таким же,
какое оно было до PHP 7.1 без этой константы.
Доступно с PHP 7.1.0.

Следующие константы можно комбинировать для использования в json_decode()
и json_encode().

JSON_INVALID_UTF8_IGNORE
(int)


Игнорировать некорректные символы UTF-8.
Доступно с PHP 7.2.0.

JSON_INVALID_UTF8_SUBSTITUTE
(int)


Преобразовывать некорректные символы UTF-8 в xfffd
(Символ Юникода ‘REPLACEMENT CHARACTER’)
Доступно с PHP 7.2.0.

JSON_THROW_ON_ERROR
(int)


Выбрасывается исключение JsonException в случае возникновения ошибок вместо
установки глобального состояния ошибки, которое может быть получено с помощью функции
json_last_error() и json_last_error_msg().
Константа JSON_PARTIAL_OUTPUT_ON_ERROR имеет приоритет над
JSON_THROW_ON_ERROR. Доступно с PHP 7.3.0.

majid4466 at gmail dot com

6 years ago


To get a really clean json string use these three constants like so:

<?php
$array
= ['€', 'http://example.com/some/cool/page', '337'];
$bad   = json_encode($array);
$good  = json_encode($arrayJSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);// $bad would be  ["u20ac","http://example.com/some/cool/page","337"]
// $good would be ["€","http://example.com/some/cool/page",337]
?>


Yzmir Ramirez

8 years ago


If you curious of the numeric values of the constants, as of JSON 1.2.1, the constants have the following values (not that you should use the numbers directly):

JSON_HEX_TAG => 1
JSON_HEX_AMP => 2
JSON_HEX_APOS => 4
JSON_HEX_QUOT => 8
JSON_FORCE_OBJECT => 16
JSON_NUMERIC_CHECK => 32
JSON_UNESCAPED_SLASHES => 64
JSON_PRETTY_PRINT => 128
JSON_UNESCAPED_UNICODE => 256

JSON_ERROR_DEPTH => 1
JSON_ERROR_STATE_MISMATCH => 2
JSON_ERROR_CTRL_CHAR => 3

JSON_ERROR_SYNTAX => 4

JSON_ERROR_UTF8 => 5
JSON_OBJECT_AS_ARRAY => 1

JSON_BIGINT_AS_STRING => 2


nikospapoutsis

6 months ago


Be EXTREMELY cautious when using the code majid4466 at gmail dot com provided, or JSON_NUMERIC_CHECK in general.

For example, in php 7.4 and 8.1 with precision: 14 and serialize_precision: -1 we get:

<?php
$array
= ['€', 55.6666666666666666, 'http://example.com/some/cool/page', '000337', '55.6666666666666666'];
echo
$case1 = json_encode($array);
echo
$case2 = json_encode($arrayJSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
echo
$case3 = json_encode($arrayJSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);

[

"u20ac",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// in $case1, both euro sign and the url change but we also lost a digit in our unquoted float (due to precision)["€",55.666666666666664,"http://example.com/some/cool/page","000337","55.6666666666666666"]
// in $case2, both euro sign and the url stay exactly the same but we still lost a digit in our unquoted float (due to precision)["€",55.666666666666664,"http://example.com/some/cool/page",337,55.666666666666664]
// in $case3, we once again keep euro sign and the url intact but this time not only our unquoted float lost a digit
// but the same happened to our quoted float and the number/string lost its leading zeros too
Also, note that in php 5.x you will probably get some different but equally wrong results as default values may be different and some functions have changed internally as well.


ASchmidt at Anamera dot net

4 years ago


In a multi-level array, JSON_FORCE_OBJECT will encode ALL nested numeric arrays as objects.

If your concern was ONLY the first-level array (e.g., to make it suitable as a MySQL JSON column), you could just cast your first-level array to object, e.g.:

<?php
$json
= json_encode( (object) $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Or, if you have large arrays and are concerned about the overhead of object casting, you could append a "null" value beyond the size of the array, which will force the array to become associative:

<?php
$beyond
= count( $array ) + 1;
if ( !
array_key_exists( $beyond, $array) )
    
$array[ $beyond ] = NULL;
$json = json_encode( $array, JSON_PRESERVE_ZERO_FRACTION+JSON_UNESCAPED_UNICODE );
?>

Of course, your later code has to treat an element with a "NULL" value the same as "!isset()", if it iterates the array.


JuanP

7 years ago


Updated format values list:

    JSON_HEX_TAG => 1
    JSON_HEX_AMP => 2
    JSON_HEX_APOS => 4
    JSON_HEX_QUOT => 8
    JSON_FORCE_OBJECT => 16
    JSON_NUMERIC_CHECK => 32
    JSON_UNESCAPED_SLASHES => 64
    JSON_PRETTY_PRINT => 128
    JSON_UNESCAPED_UNICODE => 256
    JSON_PARTIAL_OUTPUT_ON_ERROR => 512
    JSON_PRESERVE_ZERO_FRACTION => 1024


Anonymous

4 years ago


flags JSON_NUMERIC_CHECK and JSON_PRESERVE_ZERO_FRACTION are broken in php 7+ — json_encode((float)8.8) returns "8.8000000000000007", and json_encode((float)8.8, JSON_NUMERIC_CHECK) and json_encode((float)8.8, JSON_PRESERVE_ZERO_FRACTION) return "8.8000000000000007" too.

the only way to fix this is setting "serialize_precision = -1" in php.ini


on5wis at mac dot com

7 years ago


since json_encode expects a UTF-8 string there is no need to encode the € symbol.

I suggest you try to echo : json_encode('€');
It gives: "u20ac"
I'm running PHP 5.6.5 on the CLI, on MacOS X 10.10


Содержание

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

json_last_error

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

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

Описание

Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .

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

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

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

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

Коды ошибок 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()

// Неверная 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 = «xB1x31» ;

$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 ( «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 из 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, вы можете использовать:

Источник

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):

$val = json_encode($myArr);
if($val === false || is_null($val)){
    throw new Exception('Could not encode JSON');
}

or, with json_decode:

$val = json_decode($structure, true);
if(!is_array($val)){
    throw new Exception('Could not decode JSON');
}

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:

<?php

//Attempt to decode JSON.
$decoded = json_decode($arr);

//Backwards compatability.
if(!function_exists('json_last_error')){
    if($decoded === false || $decoded === null){
        throw new Exception('Could not decode JSON!');
    }
} else{
    
    //Get the last JSON error.
    $jsonError = json_last_error();
    
    //In some cases, this will happen.
    if(is_null($decoded) && $jsonError == JSON_ERROR_NONE){
        throw new Exception('Could not decode JSON!');
    }
    
    //If an error exists.
    if($jsonError != JSON_ERROR_NONE){
        $error = 'Could not decode JSON! ';
        
        //Use a switch statement to figure out the exact error.
        switch($jsonError){
            case JSON_ERROR_DEPTH:
                $error .= 'Maximum depth exceeded!';
            break;
            case JSON_ERROR_STATE_MISMATCH:
                $error .= 'Underflow or the modes mismatch!';
            break;
            case JSON_ERROR_CTRL_CHAR:
                $error .= 'Unexpected control character found';
            break;
            case JSON_ERROR_SYNTAX:
                $error .= 'Malformed JSON';
            break;
            case JSON_ERROR_UTF8:
                 $error .= 'Malformed UTF-8 characters found!';
            break;
            default:
                $error .= 'Unknown error!';
            break;
        }
        throw new Exception($error);
    }
}

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 ( 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);
    });

Introduction

JSON (JavaScript Object Notation) is a platform and language independent way of serializing objects into plaintext. Because it is often used on web and so is PHP, there is a basic extension for working with JSON in PHP.

Syntax

  • string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )
  • mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

Parameters

Parameter Details
json_encode
value The value being encoded. Can be any type except a resource. All string data must be UTF-8 encoded.
options Bitmask consisting of 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. The behaviour of these constants is described on the JSON constants page.
depth Set the maximum depth. Must be greater than zero.
json_decode
json The json string being decoded. This function only works with UTF-8 encoded strings.
assoc Should function return associative array instead of objects.
options Bitmask of JSON decode options. Currently only JSON_BIGINT_AS_STRING is supported (default is to cast large integers as floats)
  • json_decode handling of invalid JSON is very flaky, and it is very hard to reliably determine if the decoding succeeded, json_decode returns null for invalid input, even though null is also a perfectly valid object for JSON to decode to. To prevent such problems you should always call json_last_error every time you use it.

Decoding a JSON string

The json_decode() function takes a JSON-encoded string as its first parameter and parses it into a PHP variable.

Normally, json_decode() will return an object of stdClass if the top level item in the JSON object is a dictionary or an indexed array if the JSON object is an array. It will also return scalar values or NULL for certain scalar values, such as simple strings, "true", "false", and "null". It also returns NULL on any error.

// 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]);

Use var_dump() to view the types and values of each property on the object we decoded above.

// Dump our above $object to view how it was decoded
var_dump($object);

Output (note the variable types):

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"
   }
}

Note: The variable types in JSON were converted to their PHP equivalent.


To return an associative array for JSON objects instead of returning an object, pass true as the second parameter to 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);

Output (note the array associative structure):

array(4) {
  ["name"] => string(4) "Jeff"
  ["age"] => int(20)
  ["active"] => bool(true)
  ["colors"] =>
  array(2) {
    [0] => string(3) "red"
    [1] => string(4) "blue"
  }
}

The second parameter ($assoc) has no effect if the variable to be returned is not an object.

Note: If you use the $assoc parameter, you will lose the distinction between an empty array and an empty object. This means that running json_encode() on your decoded output again, will result in a different JSON structure.

If the JSON string has a «depth» more than 512 elements (20 elements in versions older than 5.2.3, or 128 in version 5.2.3) in recursion, the function json_decode() returns NULL. In versions 5.3 or later, this limit can be controlled using the third parameter ($depth), as discussed below.


According to the manual:

PHP implements a superset of JSON as specified in the original » RFC 4627 — it will also encode and decode scalar types and NULL. RFC 4627 only supports these values when they are nested inside an array or an object.
Although this superset is consistent with the expanded definition of «JSON text» in the newer » RFC 7159 (which aims to supersede RFC 4627) and » ECMA-404, this may cause interoperability issues with older JSON parsers that adhere strictly to RFC 4627 when encoding a single scalar value.

This means, that, for example, a simple string will be considered to be a valid JSON object in PHP:

$json = json_decode('"some string"', true);
var_dump($json, json_last_error_msg());

Output:

string(11) "some string"
string(8) "No error"

But simple strings, not in an array or object, are not part of the RFC 4627 standard. As a result, such online checkers as JSLint, JSON Formatter & Validator (in RFC 4627 mode) will give you an error.

There is a third $depth parameter for the depth of recursion (the default value is 512), which means the amount of nested objects inside the original object to be decoded.

There is a fourth $options parameter. It currently accepts only one value, JSON_BIGINT_AS_STRING. The default behavior (which leaves off this option) is to cast large integers to floats instead of strings.

Invalid non-lowercased variants of the true, false and null literals
are no longer accepted as valid input.

So this example:

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());

Before 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"

And after:

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"

Similar behavior occurs for false and null.

Note that json_decode() will return NULL if the string cannot be converted.

$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 

It is not safe to rely only on the return value being NULL to detect errors. For example, if the JSON string contains nothing but "null", json_decode() will return null, even though no error occurred.

Encoding a JSON string

The json_encode function will convert a PHP array (or, since PHP 5.4, an object which implements the JsonSerializable interface) to a JSON-encoded string. It returns a JSON-encoded string on success or FALSE on failure.

$array = [
    'name' => 'Jeff',
    'age' => 20,
    'active' => true,
    'colors' => ['red', 'blue'],
    'values' => [0=>'foo', 3=>'bar'],
];

During encoding, the PHP data types string, integer, and boolean are converted to their JSON equivalent. Associative arrays are encoded as JSON objects, and – when called with default arguments – indexed arrays are encoded as JSON arrays. (Unless the array keys are not a continuous numeric sequence starting from 0, in which case the array will be encoded as a JSON object.)

echo json_encode($array);

Output:

{"name":"Jeff","age":20,"active":true,"colors":["red","blue"],"values":{"0":"foo","3":"bar"}}

Arguments

Since PHP 5.3, the second argument to json_encode is a bitmask which can be one or more of the following.

As with any bitmask, they can be combined with the binary OR operator |.

PHP 5.x5.3

JSON_FORCE_OBJECT

Forces the creation of an object instead of an array

$array = ['Joel', 23, true, ['red', 'blue']];
echo json_encode($array);
echo json_encode($array, JSON_FORCE_OBJECT);

Output:

["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

Ensures the following conversions during encoding:

Constant Input Output
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);

Output:

{"tag":"<>","amp":"&","apos":"'","quot":"""}
{"tag":"u003Cu003E","amp":"u0026","apos":"u0027","quot":"u0022"}

PHP 5.x5.3

JSON_NUMERIC_CHECK

Ensures numeric strings are converted to integers.

$array = ['23452', 23452];
echo json_encode($array);
echo json_encode($array, JSON_NUMERIC_CHECK);

Output:

["23452",23452]    
[23452,23452]

PHP 5.x5.4

JSON_PRETTY_PRINT

Makes the JSON easily readable

$array = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
echo json_encode($array);
echo json_encode($array, JSON_PRETTY_PRINT);

Output:

{"a":1,"b":2,"c":3,"d":4}
{
    "a": 1,
    "b": 2,
    "c": 3,
    "d": 4
}

JSON_UNESCAPED_SLASHES

Includes unescaped / forward slashes in the output

$array = ['filename' => 'example.txt', 'path' => '/full/path/to/file/'];
echo json_encode($array);
echo json_encode($array, JSON_UNESCAPED_SLASHES);

Output:

{"filename":"example.txt","path":"/full/path/to/file"}
{"filename":"example.txt","path":"/full/path/to/file"}

JSON_UNESCAPED_UNICODE

Includes UTF8-encoded characters in the output instead of u-encoded strings

$blues = ["english"=>"blue", "norwegian"=>"blå", "german"=>"blau"];
echo json_encode($blues);
echo json_encode($blues, JSON_UNESCAPED_UNICODE);

Output:

{"english":"blue","norwegian":"blu00e5","german":"blau"}
{"english":"blue","norwegian":"blå","german":"blau"}

PHP 5.x5.5

JSON_PARTIAL_OUTPUT_ON_ERROR

Allows encoding to continue if some unencodable values are encountered.

$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);

Output:

{"file":null,"name":"foo.txt"}

PHP 5.x5.6

JSON_PRESERVE_ZERO_FRACTION

Ensures that floats are always encoded as floats.

$array = [5.0, 5.5];
echo json_encode($array);
echo json_encode($array, JSON_PRESERVE_ZERO_FRACTION);

Output:

[5,5.5]
[5.0,5.5]

PHP 7.x7.1

JSON_UNESCAPED_LINE_TERMINATORS

When used with JSON_UNESCAPED_UNICODE, reverts to the behaviour of older PHP versions, and does not escape the characters U+2028 LINE SEPARATOR and U+2029 PARAGRAPH SEPARATOR. Although valid in JSON, these characters are not valid in JavaScript, so the default behaviour of JSON_UNESCAPED_UNICODE was changed in version 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);

Output:

{"line":"u2028","paragraph":"u2029"}
{"line":"
","paragraph":"
"}

Debugging JSON errors

When json_encode or json_decode fails to parse the string provided, it will return false. PHP itself will not raise any errors or warnings when this happens, the onus is on the user to use the json_last_error() and json_last_error_msg() functions to check if an error occurred and act accordingly in your application (debug it, show an error message, etc.).

The following example shows a common error when working with JSON, a failure to decode/encode a JSON string (due to the passing of a bad UTF-8 encoded string, for example).

// 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() returns a human readable message of the last error that occurred when trying to encode/decode a string.

  • This function will always return a string, even if no error occurred.
    The default non-error string is No Error
  • It will return false if some other (unknown) error occurred
  • Careful when using this in loops, as json_last_error_msg will be overridden on each iteration.

You should only use this function to get the message for display, not to test against in control statements.

// 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());
}

This function doesn’t exist before PHP 5.5. Here is a polyfill implementation:

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() returns an integer mapped to one of the pre-defined constants provided by PHP.

Constant Meaning
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 (since PHP 5.3.3)
JSON_ERROR_UTF8 Malformed UTF-8 characters, possibly incorrectly encoded (since PHP 5.5.0)
JSON_ERROR_RECURSION One or more recursive references in the value to be encoded
JSON_ERROR_INF_OR_NAN One or more NAN or INF values in the value to be encoded
JSON_ERROR_UNSUPPORTED_TYPE A value of a type that cannot be encoded was given

Using JsonSerializable in an Object

PHP 5.x5.4

When you build REST API’s, you may need to reduce the information of an object to be passed to the client application. For this purpose, this example illustrates how to use the JsonSerialiazble interface.

In this example, the class User actually extends a DB model object of a hypotetical 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
        ];
    }
}

Add JsonSerializable implementation to the class, by providing the jsonSerialize() method.

public function jsonSerialize()

Now in your application controller or script, when passing the object User to json_encode() you will get the return json encoded array of the jsonSerialize() method instead of the entire object.

json_encode($User);

Will return:

{"name":"John", "surname":"Doe", "username" : "TestJson"}

properties values example.

This will both reduce the amount of data returned from a RESTful endpoint, and allow to exclude object properties from a json representation.


Using Private and Protected Properties with json_encode()

To avoid using JsonSerializable, it is also possible to use private or protected properties to hide class information from json_encode() output. The Class then does not need to implement JsonSerializable.

The json_encode() function will only encode public properties of a
class into 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));

Output:

string(44) "{"name":null,"surname":null,"username":null}"

Header json and the returned response

By adding a header with content type as 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();

The header is there so your app can detect what data was returned and how it should handle it.
Note that : the content header is just information about type of returned data.

If you are using UTF-8, you can use :

header("Content-Type: application/json;charset=utf-8");

Example jQuery :

$.ajax({
        url:'url_your_page_php_that_return_json'        
    }).done(function(data){
        console.table('json ',data);
        console.log('Menu1 : ', data.menu1);
    });

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Json error cyclic dependency detected
  • Json error 6002 энт
  • Json error 6002 entpro
  • Json error 500 internal server error
  • Json deserialization error

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии