(PHP 5 >= 5.3.0, PHP 7, PHP 8)
json_last_error — Возвращает последнюю ошибку
Описание
json_last_error(): int
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих
констант:
| Константа | Значение | Доступность |
|---|---|---|
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 ¶
8 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 (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
One of the new features coming to PHP 7.3 is better error handling for json_encode() and json_decode(). The RFC was unanimously accepted by a 23 to 0 vote. Let’s take a look at how we handle JSON errors in <= PHP 7.2, and the new improvements coming in PHP 7.3.
Background
In the current stable, PHP v7.2, if you want to determine if JSON is invalid, you have to use the json_last_error() function to verify:
>>> json_decode("{");
=> null
>>> json_last_error();
=> 4
>>> json_last_error() === JSON_ERROR_NONE
=> false
>>> json_last_error_msg()
=> "Syntax error"
For example, in the Laravel IlluminateEncryptionEncrypter class here’s a check to make sure calling json_encode() doesn’t result in an error:
// Once we get the encrypted value we'll go ahead and base64_encode the input
// vector and create the MAC for the encrypted value so we can then verify
// its authenticity. Then, we'll JSON the data into the "payload" array.
$json = json_encode(compact('iv', 'value', 'mac'));
if (json_last_error() !== JSON_ERROR_NONE) {
throw new EncryptException('Could not encrypt the data.');
}
return base64_encode($json);
We can at least determine if JSON encoding/decoding had an error, but it’s a little clunky compared to throwing an exception, which packages the error code and message neatly together.
Although you have to opt-in, v7.3 has an excellent way of allowing you to catch and handle JSON exceptions—let’s check out the new flag we can use!
The Throw on Error Flag in PHP 7.3
With the new option flag JSON_THROW_ON_ERROR it’s possible to rewrite this block of code with a try/catch. Maybe some something like the following:
use JsonException;
try {
$json = json_encode(compact('iv', 'value', 'mac'), JSON_THROW_ON_ERROR);
return base64_encode($json);
} catch (JsonException $e) {
throw new EncryptException('Could not encrypt the data.', 0, $e);
}
I think this new style is especially useful for userland code when you receive some JSON data and instead of digging around for json_last_error() and the matching flag, your JSON encoding and decoding can take advantage of the error handler.
The json_decode() function has a few more arguments, and will look something like the following in PHP 7.3 if you want to take advantage of error handling:
use JsonException;
try {
return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
// Handle the JSON Exception
}
// Or even just let it bubble up...
/**
* Decode a JSON string into an array
*
* @return array
* @throws JsonException
*/
function decode($jsonString) {
return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR);
}
Getting the Error Code and Message
Previously you retrieve the JSON error code and message using the following functions:
// Error code
json_last_error();
// Human-friendly message
json_last_error_msg();
If you use the new JSON_THROW_ON_ERROR flag, here’s how you’ll get the code and message:
try {
return json_decode($jsonString, $assoc = true, $depth = 512, JSON_THROW_ON_ERROR);
} catch (JsonException $e) {
$e->getMessage(); // like json_last_error_msg()
$e->getCode(); // like json_last_error()
}
See the base Exception class for more API details, the JsonException exception is a subclass of Exception.
JSON’s Default Behavior in PHP 7.3
When upgrading to PHP 7.3, your code will be backward compatible on day one and continue to work as expected.
PHP’s default json_encode|decode() behavior hasn’t changed, the throw on error RFC adds a new option and exception class.
Learn More
You can learn all about the most prominent features coming to PHP 7.3 in our post announcing the PHP 7.3 Alpha 1 release last week. Also, read through the RFC for JSON_THROW_ON_ERROR for full details on the proposal coming to PHP 7.3.
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_last_error
- Описание
- Список параметров
- Возвращаемые значения
- Примеры
- Смотрите также
- Возврат JSON из PHP-скрипта
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 3
- Ответ 4
- Ответ 5
- PHP JSON
- Вступление
- Синтаксис
- параметры
- замечания
- Декодирование строки JSON
- Кодирование строки JSON
- аргументы
- JSON_FORCE_OBJECT
- JSON_HEX_TAG , JSON_HEX_AMP , JSON_HEX_APOS , JSON_HEX_QUOT
- JSON_NUMERIC_CHECK
- JSON_PRETTY_PRINT
- JSON_UNESCAPED_SLASHES
- JSON_UNESCAPED_UNICODE
- JSON_PARTIAL_OUTPUT_ON_ERROR
- JSON_PRESERVE_ZERO_FRACTION
- JSON_UNESCAPED_LINE_TERMINATORS
- Отладка ошибок JSON
- json_last_error_msg
- json_last_error
- Использование JsonSerializable в объекте
- пример значений свойств.
- Использование частных и защищенных свойств с помощью json_encode()
- Выход:
- Заголовок json и возвращаемый ответ
json_last_error
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
json_last_error — Возвращает последнюю ошибку
Описание
Возвращает последнюю ошибку (если она есть), произошедшую во время последнего кодирования/декодирования JSON если при вызове не использовался флаг JSON_THROW_ON_ERROR .
Список параметров
У этой функции нет параметров.
Возвращаемые значения
Возвращает целочисленное значение, которое может быть одной из следующих констант:
Коды ошибок JSON
| Константа | Значение | Доступность |
|---|---|---|
| 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, вы можете использовать:
Источник
json_decode
(PHP 5 >= 5.2.0, PECL json >= 1.2.0, PHP 7)
json_decode — Декодирует JSON строку
Описание
mixed json_decode
( string $json
[, bool $assoc = false
[, int $depth = 512
[, int $options = 0
]]] )
Список параметров
-
json -
jsonстрока (string) для декодирования.Эта функция работает только со строками в UTF-8 кодировке.
Замечание:
PHP реализует надмножество JSON, который описан в первоначальном
» RFC 4627, — также кодируя и декодируя скалярные типы иNULL.
RFC 4627 поддерживает эти значения только в случае,
если они находятся внутри массива или объекта.И хотя это надмножество согласуется с расширенным определением
«JSON текста» из новых » RFC 7159
(который старается заменить собой RFC 4627) и » ECMA-404,
это все равно может приводить к проблемам совместимости со старыми парсерами JSON, которые
строго придерживаются RFC 4627 с кодированием скалярных значений. -
assoc -
Если
TRUE, возвращаемые объекты будут преобразованы в ассоциативные массивы. -
depth -
Указывает глубину рекурсии.
-
options -
Битовая маска опций декодирования JSON. В настоящий момент поддерживается только
JSON_BIGINT_AS_STRING
(по умолчанию большие целые числа приводятся к числам с плавающей запятой (float))
Возвращаемые значения
Возвращает данные json преобразованные в соответствующие
типы PHP. Значения true, false и
null возвращаются как TRUE, FALSE
и NULL соответственно. NULL также возвращается, если json
не может быть преобразован или закодированные данные содержат вложенных уровней
больше, чем допустимый предел для рекурсий.
Примеры
Пример #1 Пример использования json_decode()
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';var_dump(json_decode($json));
var_dump(json_decode($json, true));?>
Результат выполнения данного примера:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
Пример #2 Доступ к свойствам объектов с неправильными именами
Доступ к элементам объекта, которые содержат символы недопустимые
согласно соглашению об именах PHP (т.е. дефис), может производиться
путем обрамления имени элемента фигурными скобками и апострофами.
<?php
$json
= '{"foo-bar": 12345}';$obj = json_decode($json);
print $obj->{'foo-bar'}; // 12345?>
Пример #3 Распространенная ошибка при использовании json_decode()
<?php// Следующие строки являются валидным кодом JavaScript, но не валидными JSON данными
// Имя и значение должны помещаться в двойные кавычки
// Одинарные кавычки использовать нельзя
$bad_json = "{ 'bar': 'baz' }";
json_decode($bad_json); // null
// Имя должно обрамляться в двойные кавычки
$bad_json = '{ bar: "baz" }';
json_decode($bad_json); // null
// Не должно быть завершающей запятой (без последующего элемента)
$bad_json = '{ bar: "baz", }';
json_decode($bad_json); // null?>
Пример #4 Ошибки с глубиной вложенных объектов (depth)
<?php
// Кодирование данных.
$json = json_encode(
array(
1 => array(
'English' => array(
'One',
'January'
),
'French' => array(
'Une',
'Janvier'
)
)
)
);// Создаем массив с ошибками.
$constants = get_defined_constants(true);
$json_errors = array();
foreach ($constants["json"] as $name => $value) {
if (!strncmp($name, "JSON_ERROR_", 11)) {
$json_errors[$value] = $name;
}
}// Отображаем ошибки для разных глубин рекурсий
foreach (range(4, 3, -1) as $depth) {
var_dump(json_decode($json, true, $depth));
echo 'Last error: ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL;
}
?>
Результат выполнения данного примера:
array(1) {
[1]=>
array(2) {
["English"]=>
array(2) {
[0]=>
string(3) "One"
[1]=>
string(7) "January"
}
["French"]=>
array(2) {
[0]=>
string(3) "Une"
[1]=>
string(7) "Janvier"
}
}
}
Last error: JSON_ERROR_NONE
NULL
Last error: JSON_ERROR_DEPTH
Пример #5 json_decode() с большими целыми числами
<?php
$json = '{"number": 12345678901234567890}';var_dump(json_decode($json));
var_dump(json_decode($json, false, 512, JSON_BIGINT_AS_STRING));?>
Результат выполнения данного примера:
object(stdClass)#1 (1) {
["number"]=>
float(1.2345678901235E+19)
}
object(stdClass)#1 (1) {
["number"]=>
string(20) "12345678901234567890"
}
Примечания
Замечание:
Спецификация JSON не тоже самое, что и JavaScript, но является его частью.
Замечание:
В случае ошибки декодирования можно использовать
json_last_error() для определения ее причины.
Список изменений
| Версия | Описание |
|---|---|
| 5.6.0 |
Недопустимые варианты true, false и null не в нижнем регистре больше не допускаются во входящих данных, и приводят к предупреждениям. |
| 5.4.0 |
Был добавлен параметр options.
|
| 5.3.0 |
Добавлен опциональный параметр depth.Глубина рекурсии по умолчанию увеличено с 128 до 512 |
| 5.2.3 | Глубина рекурсии увеличена с 20 до 128 |
| 5.2.1 | Добавлена поддержка декодирования основных типов JSON. |
Вернуться к: 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);
});