Давайте разберем, как работает JSON в PHP
Подробную документацию всегда можно найти по этой ссылке:
https://www.php.net/manual/ru/book.json.php
Кодирование при помощи функции json_encode
Функция работает только с кодировкой UTF-8.
Рассмотрим простой пример:
$array = [ 'one' => 1, 'two' => 2, ]; $json = json_encode($array); echo $json;
Результат выполнения кода:
{"one":1,"two":2}
Как видим ассоциативный массив превратился в обычную json строку.
Более сложный пример:
$array = [ 'Ключ 1' => 'Значение 1', 'Ключ 2' => 'Значение 2', 'Ключ 3' => 'Значение 3', ]; $json = json_encode($array); echo $json;
Результат выполнения кода:
{"\u041a\u043b\u044e\u0447 1":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 1","\u041a\u043b\u044e\u0447 2":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 2","\u041a\u043b\u044e\u0447 3":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 3"}
Что произошло c кириллицей?
Дело в том, что по умолчанию многобайтовые символы Unicode кодируются как \uXXXX. При раскодировании функцией json_decode они преобразуются в нормальные строки. В некоторых случаях мы можем захотеть избежать этого экранирования, например, чтобы посмотреть как выглядит наш JSON.
Для этого воспользуемся флагом JSON_UNESCAPED_UNICODE:
$json = json_encode($array, JSON_UNESCAPED_UNICODE); echo $json;
Получаем такой результат:
{"Ключ 1":"Значение 1","Ключ 2":"Значение 2","Ключ 3":"Значение 3"}
Мы может еще в целях изучения кода преобразовать его в более человеческий вид, при помощи дополнительного флага JSON_PRETTY_PRINT
$json = json_encode($array, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); echo $json;
Получаем такой результат:
{ "Ключ 1": "Значение 1", "Ключ 2": "Значение 2", "Ключ 3": "Значение 3" }
Мы разобрались, как кодировать наши переменные в формат JSON при помощи json_encode.
Более подробная информация об этой функции: https://www.php.net/manual/ru/function.json-encode.php
Другие предопределенные константы с префиксом JSON_
https://www.php.net/manual/ru/json.constants.php
Декодирование c помощью json_decode
Допустим у нас есть строка в формате JSON. Возьмем ее из предыдущего примера:
$json = '{"Ключ 1":"Значение 1","Ключ 2":"Значение 2","Ключ 3":"Значение 3"}';
Давайте раскодируем ее:
$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.
Более подробная информация об этой функции: https://www.php.net/manual/ru/function.json-decode.php
Обработка ошибок
В случае ошибки, эти функции просто молча возвращают null.
Мы можем проверить, что нам вернулось null и посмотреть какая произошла ошибка следующим образом:
$json = '{{{ некорректный JSON!'; $var = json_decode($json, true); if($var === null) { echo json_last_error_msg(); // эта строка выведет: Syntax error }
Иногда нам может быть полезно не молчаливо возвращать null, а выкинуть Exception и обработать его. PHP >7.3 предоставляет нам такую возможность.
Это можно сделать при помощи флага JSON_THROW_ON_ERROR
Рассмотрим пример:
$json = '{{{ некорректный JSON!'; $var = json_decode($json, true, JSON_THROW_ON_ERROR);
Теперь результат этого кода JsonException с сообщением Syntax error
Более подробно про обработку ошибок JSON:
https://www.php.net/manual/ru/function.json-last-error-msg.php
https://www.php.net/manual/ru/function.json-last-error.php
Как вывести 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 скрипту таким образом:
$('.js-button').on('click', function(){ $.ajax({ url: '/text_json.php', type: 'get', success: function(response) { // выводим alert со строкой "ваши данные", // которую мы только что получили из php alert(response.data); } }); });
Отправка 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);
Подробнее про http запросы при помощи cURL в php: https://phpstack.ru/php/curl-v-php-primery-post-get-zaprosov-s-headers-cookie-json-i-mnogopotocnostu.html
Спасибо за внимание. Если после прочтения у вас остались вопросы - напишите какие.