- json_encode
- Список параметров
- Возвращаемые значения
- Список изменений
- Примеры
- Примечания
- Смотрите также
- JSON в PHP: примеры json_encode, json_decode, работа с кириллицей и utf-8
- Кодирование при помощи функции json_encode
- Результат выполнения кода:
- Что произошло c кириллицей?
- Декодирование c помощью json_decode
- Обработка ошибок
- Как вывести JSON ответ на ajax запрос
- Отправка JSON запросов на другой сервер.
json_encode
Возвращает строку, содержащую JSON-представление value .
Список параметров
value — значение, которое будет закодировано. Может быть любого типа за исключением resource .
Все строковые данные должны быть в кодировке UTF-8.
Замечание:
PHP реализует надмножество JSON, который описан в первоначальном » RFC 4627, — также кодируя и декодируя скалярные типы и NULL . RFC 4627 поддерживает эти значения только в случае, если они находятся внутри массива или объекта.
И хотя это надмножество согласуется с расширенным определением «JSON текста» из новых » RFC 7159 (который старается заменить собой RFC 4627) и » ECMA-404, это все равно может приводить к проблемам совместимости со старыми парсерами JSON, которые строго придерживаются RFC 4627 с кодированием скалярных значений.
Битовая маска составляемая из значений 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_UNESCAPED_UNICODE . Смысл этих констант объясняется на странице JSON констант.
Задает максимальную глубину. Должен быть больше нуля.
Возвращаемые значения
Возвращает JSON закодированную строку ( string ) в случае успеха или FALSE в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
5.5.0 | Добавлен параметр depth . |
5.4.0 | В options были добавлены константы JSON_PRETTY_PRINT , JSON_UNESCAPED_SLASHES , и JSON_UNESCAPED_UNICODE . |
5.3.3 | Константа JSON_NUMERIC_CHECK была добавлена в option . |
5.3.0 | Был добавлен параметр options . |
Примеры
Пример #1 Пример использования json_encode()
$arr = array( ‘a’ => 1 , ‘b’ => 2 , ‘c’ => 3 , ‘d’ => 4 , ‘e’ => 5 );
?php
Результат выполнения данного примера:
Пример #2 Пример использования json_encode() , показывающий действия некоторых его опций
echo «Обычно: » , json_encode ( $a ), «\n» ;
echo «Тэги: » , json_encode ( $a , JSON_HEX_TAG ), «\n» ;
echo «Апострофы: » , json_encode ( $a , JSON_HEX_APOS ), «\n» ;
echo «Кавычки: » , json_encode ( $a , JSON_HEX_QUOT ), «\n» ;
echo «Амперсанды: » , json_encode ( $a , JSON_HEX_AMP ), «\n» ;
echo «Юникод: » , json_encode ( $a , JSON_UNESCAPED_UNICODE ), «\n» ;
echo «Все: » , json_encode ( $a , JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE ), «\n\n» ;
echo «Отображение пустого массива как массива: » , json_encode ( $b ), «\n» ;
echo «Отображение пустого массива как объекта: » , json_encode ( $b , JSON_FORCE_OBJECT ), «\n\n» ;
echo «Отображение неассоциативного массива как массива: » , json_encode ( $c ), «\n» ;
echo «Отображение неассоциативного массива как объекта: » , json_encode ( $c , JSON_FORCE_OBJECT ), «\n\n» ;
$d = array( ‘foo’ => ‘bar’ , ‘baz’ => ‘long’ );
echo «Ассоциативный массив всегда отображается как объект: » , json_encode ( $d ), «\n» ;
echo «Ассоциативный массив всегда отображается как объект: » , json_encode ( $d , JSON_FORCE_OBJECT ), «\n\n» ;
?>
Результат выполнения данного примера:
Обычно: [«»,»‘bar'»,»\»baz\»»,»&blong&»,»\u00e9″] Тэги: [«\u003Cfoo\u003E»,»‘bar'»,»\»baz\»»,»&blong&»,»\u00e9″] Апострофы: [«»,»\u0027bar\u0027″,»\»baz\»»,»&blong&»,»\u00e9″] Кавычки: [«»,»‘bar'»,»\u0022baz\u0022″,»&blong&»,»\u00e9″] Амперсанды: [«»,»‘bar'»,»\»baz\»»,»\u0026blong\u0026″,»\u00e9″] Unicode: [«»,»‘bar'»,»\»baz\»»,»&blong&»,»é»] Все: [«\u003Cfoo\u003E»,»\u0027bar\u0027″,»\u0022baz\u0022″,»\u0026blong\u0026″,»é»] Отображение пустого массива как массива: [] Отображение не ассоциативного массива как объекта: <> Отображение неассоциативного массива как массива: [[1,2,3]] Отображение неассоциативного массива как объекта: > Ассоциативный массив всегда отображается как объект: Ассоциативный массив всегда отображается как объект:
Пример #3 Пример с последовательными индексами начинающимися с нуля и непоследовательными индексами массивов
echo «Последовательный массив» . PHP_EOL ;
$sequential = array( «foo» , «bar» , «baz» , «blong» );
var_dump (
$sequential ,
json_encode ( $sequential )
);
?php
echo PHP_EOL . «Непоследовательный массив» . PHP_EOL ;
$nonsequential = array( 1 => «foo» , 2 => «bar» , 3 => «baz» , 4 => «blong» );
var_dump (
$nonsequential ,
json_encode ( $nonsequential )
);
echo PHP_EOL . «Последовательный массив с одним удаленным индексом» . PHP_EOL ;
unset( $sequential [ 1 ]);
var_dump (
$sequential ,
json_encode ( $sequential )
);
?>
Результат выполнения данного примера:
Последовательный массив array(4) < [0]=>string(3) "foo" [1]=> string(3) "bar" [2]=> string(3) "baz" [3]=> string(5) "blong" > string(27) "["foo","bar","baz","blong"]" Непоследовательный массив array(4) < [1]=>string(3) "foo" [2]=> string(3) "bar" [3]=> string(3) "baz" [4]=> string(5) "blong" > string(43) "" Последовательный массив с одним удаленным индексом array(3) < [0]=>string(3) "foo" [2]=> string(3) "baz" [3]=> string(5) "blong" > string(33) ""
Примечания
Замечание:
В случае ошибки кодирования, можно использовать json_last_error() для определения точной ошибки.
Замечание:
При кодировании массива в случае, если его индексы не являются последовательными числами от нуля, то все индексы кодируются в строковые ключи для каждой пары индекс-значение.
Замечание:
Как и эталонный кодировщик JSON, json_encode() будет создавать JSON в виде простого значения (т.е. не объект и не массив), если ему переданы string , integer , float или boolean в качестве входящего значения value . Большинство декодеров воспринимают эти значения как правильный JSON, но некоторые нет, потому что спецификация неоднозначна на этот счет.
Всегда проверяйте, что ваш JSON декодер может правильно обрабатывать данные, которые вы создаете с помощью json_encode() .
Смотрите также
- JsonSerializable
- json_decode() — Декодирует JSON строку
- json_last_error() — Возвращает последнюю ошибку
- serialize() — Генерирует пригодное для хранения представление переменной
JSON в PHP: примеры json_encode, json_decode, работа с кириллицей и utf-8
Подробную документацию всегда можно найти по этой ссылке:
Кодирование при помощи функции json_encode
Функция работает только с кодировкой UTF-8.
Рассмотрим простой пример:
$array = [ 'one' => 1, 'two' => 2, ]; $json = json_encode($array); echo $json;
Результат выполнения кода:
Как видим ассоциативный массив превратился в обычную json строку.
$array = [ 'Ключ 1' => 'Значение 1', 'Ключ 2' => 'Значение 2', 'Ключ 3' => 'Значение 3', ]; $json = json_encode($array); echo $json;
Результат выполнения кода:
Что произошло c кириллицей?
Дело в том, что по умолчанию многобайтовые символы Unicode кодируются как \uXXXX. При раскодировании функцией json_decode они преобразуются в нормальные строки. В некоторых случаях мы можем захотеть избежать этого экранирования, например, чтобы посмотреть как выглядит наш JSON.
Для этого воспользуемся флагом JSON_UNESCAPED_UNICODE:
$json = json_encode($array, JSON_UNESCAPED_UNICODE); echo $json;
Мы может еще в целях изучения кода преобразовать его в более человеческий вид, при помощи дополнительного флага JSON_PRETTY_PRINT
$json = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); echo $json;
Мы разобрались, как кодировать наши переменные в формат JSON при помощи json_encode.
Другие предопределенные константы с префиксом JSON_ https://www.php.net/manual/ru/json.constants.php
Декодирование c помощью json_decode
Допустим у нас есть строка в формате JSON. Возьмем ее из предыдущего примера:
$var = json_decode($json); var_dump($var);
У нас получился результат:
object(stdClass)#117 (3) < ["Ключ 1"]=>string(18) "Значение 1" ["Ключ 2"]=> string(18) "Значение 2" ["Ключ 3"]=> string(18) "Значение 3" >
Видим, что это тип переменной stdClass. То есть несмотря на то, что мы изначально кодировали в json обычный ассоциативный массив, в результате декодирования у нас получился объект. Подробнее об этом поведении написано здесь: https://phpstack.ru/php/json_decode-kak-perevesti-rezultat-v-massiv.html
Как нам все таки получить обычный массив? Нужно в json_decode передать вторым параметром true:
$var = json_decode($json, true); var_dump($var);
array(3) < ["Ключ 1"]=>string(18) "Значение 1" ["Ключ 2"]=> string(18) "Значение 2" ["Ключ 3"]=> string(18) "Значение 3" >
Теперь мы получили обычный массив. Таким образом разобрались как работать с функцией json_decode для декодирования строки формата JSON.
Обработка ошибок
В случае ошибки, эти функции просто молча возвращают null.
Мы можем проверить, что нам вернулось null и посмотреть какая произошла ошибка следующим образом:
Иногда нам может быть полезно не молчаливо возвращать null, а выкинуть Exception и обработать его. PHP >7.3 предоставляет нам такую возможность.
Это можно сделать при помощи флага JSON_THROW_ON_ERROR
Теперь результат этого кода JsonException с сообщением Syntax error
Более подробно про обработку ошибок JSON:
Как вывести JSON ответ на ajax запрос
Когда к нашему PHP скрипту обращается например javascript с ajax запросом, для того, чтобы подгрузить на страницу новые данные, то часто возникает необходимость ответить в формате JSON.
Для того, чтобы это сделать, нужно отправить заголовок Content-type:application/json;charset=utf-8 и просто вывести строку с закодированными данными.
Содержимое файла text_json.php
$array = ['data' => 'ваши данные']; $jsonString = json_encode($array); // переводим данные в JSON строку // отправляем заголовок, который позволит клиенту определить, // что возвращается ответ в формате JSON header('Content-type:application/json;charset=utf-8'); echo $jsonString; // выводим JSON строку exit(); // прекращаем выполнение скрипта
Тем временем в javascript мы можем обратиться к нашему php скрипту таким образом:
Отправка JSON запросов на другой сервер.
Некоторые интернет сервисы принимает запросы в формате JSON. Давайте рассмотрим простой пример как отправить такой запрос.
// httpbin.org - это такой интернет сервис, который помогает нам тестировать запросы. $url = 'https://httpbin.org/anything'; // формируем массив $post_data = [ 'ключ' => 'значение' ]; // преобразуем массив в json $data_json = json_encode($post_data); $curl = curl_init(); curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json','Content-Length: ' . strlen($data_json)]); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_VERBOSE, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, $data_json); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_POST, true); $response = curl_exec($curl); // сервис вернул нам строку в формате json, давайте ее раскодируем применив знания из этой статьи $result = json_decode($response, true); var_dump($result);
Спасибо за внимание. Если после прочтения у вас остались вопросы — напишите какие.