🏠 | 💻 IT | Программирование Code | PHP |

json_decode PHP

Введение

Попробуем разобраться с обработкой JSON средствами PHP

Простейший JSON

Предположим, что у нас есть следующий JSON

$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'

Сделаем json_decode без дополнительных параметров

var_dump(json_decode($json));

object(stdClass)#1 (5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) }

var_dump(json_decode($json, true));

array(5) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) ["d"]=> int(4) ["e"]=> int(5) }

В первом случае var_dump возвращает объект а во втором массив

$json_decode = json_decode($json); $json_decode_true = json_decode($json,true); echo $json_decode;

здесь ничего не получится вывести

echo $json_decode_true;

Array

Попробуем вытащить из массива отдельные элементы

echo $json_decode_true["a"]; echo'<br>; echo $json_decode_true["b"];

1
4

JSON с вложением

Усложним задачу. Пусть теперь JSON содержит вложения второго уровня.

$json2 = ' { "a":{"a_item_1":11,"a_item_2" : 12, "a_item_3" : 13}, "b":2,"c":3, "d":{"d_item_1":41,"d_item_2" : 42, "d_item_3" : 43},"e":5 }' ;

Попробуем достать один из вложенных элементов

$json_decode_true2 = json_decode($json2,true); echo $json_decode_true2["c"]; echo'<br>; echo $json_decode_true2["d"]; echo'<br>; echo $json_decode_true2["d"]["d_item_2"];

3
Array
42

Как Вы можете видеть, обычные элементы по-прежнему доступны. Новые элементы возвращают Array если обратиться к верхнему уровню, либо значение, если обратиться к элементу массива.

JSON с массивом

Массивы заключены в квадратные скобки. Предположим, что он довольно простой.

{ "a": [{ "a_item_1": 11, "a_item_2": 12, "a_item_3": 13 }, { "a_item_4": 14, "a_item_5": 15, "a_item_6": 16 } ], "b": 2, "c": 3, "d": { "d_item_1": 41, "d_item_2": 42, "d_item_3": 43 }, "e": 5 }

Чтобы обратиться к элементу массива нужно сперва указать его индекс в квадратных скобках.

Достанем по элементу из первой части массива {"a_item_1":11,"a_item_2" : 12, "a_item_3" : 13} и из второй {"a_item_4":14,"a_item_5" : 15, "a_item_6" : 16}

Ожидаем получить 13 и 16

$json_decode_true3 = json_decode($json3, true); echo $json_decode_true3["a"]; echo'<br>; echo $json_decode_true3["a"][0]["a_item_3"]; echo'<br>; echo $json_decode_true3["a"][1]["a_item_6"];

Array
13
16

Реальный пример

Сайту HeiHei.ru нужно получить информацию о пробках на границе с Финляндией.

Для этого он обращается к API сайта narganitse.ru. Который выглядит следующим образом

[ { // Из России "1": { // Торфяновка "number": "12", // Число машин "date": 1325513571, // UNIX-время, когда было получено сообщение "comment": "", // Комментарий "changes": -11, // Изменение относительно предыдущего сообщения "author": "test", // Имя автора комментария "url": "", "waiting": 15 // Примерное время ожидания }, "2": { // Брусничное "number": "0", "date": 1303291117, "comment": "", "changes": -55, "author": "***0606", "url": "", "waiting": 0 }, "3": { // Светогорск "number": "35", "date": 1303287127, "comment": "машин не много: 30-35. только подъехали и пока стоим.", "changes": -20, "author": "Explorer002", "url": "", "waiting": 42 } }, { // В Россию "1": { "number": "13", "date": "1326638542", "comment": "", "changes": -32, "author": "***2117", "url": "", "waiting": 16 }, "2": { "number": "60", "date": 1303294658, "comment": "", "changes": 40, "author": "granitsa-online.com", "url": "http://granitsa-online.com", "waiting": 72 }, "3": { "number": "0", "date": 1303279308, "comment": "", "changes": -12, "author": "Logan", "url": "", "waiting": 0 } } ]

Этот API актуален по крайней мере на февраль 2020-го года. Последняя версия доступна на сайте

$api_address = "http://api.nagranitse.ru/data.json"; $json_border = file_get_contents($api_address);

Посмотрим, как выглядит необработанный JSON, который мы получили от API.

echo $json_border;

[{"1":{"number":"20","date":1591463341,"comment":"","changes":-42,"author":"granitsa-online.com","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"такое впечатление,что границу вообще не закрывали","last_comment_author":"Влад","last_comment_date":1588197557,"waiting":24},"2":{"number":"32","date":1591463341,"comment":"","changes":-104,"author":"granitsa-online.com","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Вы чего тут устроили епта!!! Балбесы","last_comment_author":"Питер","last_comment_date":1588933960,"waiting":39},"3":{"number":"25","date":1591463341,"comment":"","changes":-70,"author":"granitsa-online.com","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Добрый у-ух быдляк , так написано на Авито в твоём аккаунте )","last_comment_author":"Спикулянты","last_comment_date":1588846590,"waiting":30},"4":{"number":"0","date":1588936389,"comment":"Добрый У-ух мой друг поедет до 1.06. Его номер +358469588173 Виктор","changes":0,"author":"Водитель фур","url":"","last_comment":"Павел долбоеб....у него в часах 69 минут....Долбоеб","last_comment_author":"Сашок","last_comment_date":1587026039},"5":{"number":"3","date":1585747377,"comment":"Ахмет с Махараджой все попутали и теперь на Вяртсиля катают друг друга до дыма. А мой самокат Махарадже надоел. Я в депрессии на Вяртсиля.","changes":1,"author":"Павел","url":"","last_comment":"Добрый у-ух быдляк , так написано на Авито в твоём аккаунте )","last_comment_author":"Спикулянты","last_comment_date":1588846548},"6":{"number":"5","date":1584625270,"comment":"Добрый У-ух пей сое флейринг на Бруснике и жди по 5 часов проехать обе границы","changes":1,"author":"Павел","url":"","last_comment":"Спасибо, мужчины!!! Не съездить к Финам, так хоть похихикать))) Павлу отдельное спасибо за кипешь)","last_comment_author":"Инна","last_comment_date":1584975321}},{"1":{"number":"24","date":1591463341,"comment":"","changes":4,"author":"granitsa-online.com","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Здравствуйте всем кто в пути... Пропускают ли с двумя паспортами в Россию? Ответьте пожалуйста без ...","last_comment_author":"Римма","last_comment_date":1588256835,"waiting":29},"2":{"number":"45","date":1591463341,"comment":"","changes":21,"author":"granitsa-online.com","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно...","last_comment_author":"оля","last_comment_date":1586265072,"waiting":54},"3":{"number":"10","date":1591463341,"comment":"","changes":0,"author":"granitsa-online.com","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Лиза,позвоните на таможню,вы уже одно и тоже третий день спрашиваете.","last_comment_author":"Galina","last_comment_date":1584714680,"waiting":12},"4":{"number":"0","date":1590423782,"comment":"сколько денег даёте что бы посылку забрать ?","changes":0,"author":"водитель фуры","url":"","last_comment":"Реально","last_comment_author":"Фантомас","last_comment_date":1585069860},"5":{"number":"0","date":1589230261,"comment":"ЛЕГКОВОЙ ЗАКРЫТ!","changes":0,"author":"Алексей","url":"","last_comment":"Машин не много, 10 минут простояли, поехали. Впереди 4 машины","last_comment_author":"Yuliya","last_comment_date":1578406001},"6":{"number":"0","date":1588339479,"comment":"","changes":-70,"author":"Евгений","url":"","last_comment":"Приезжающих на карантин не отправляют?","last_comment_author":"Евгений","last_comment_date":1584430806}}]

Теперь применим json_decode

$border_obj = json_decode($json_border,true);

Убедимся, что это массив.

echo $border_obj;

Array

И посмотрим содержимое. С помощью

var_dump($border_obj);

Массив содержит два вложенных массива - это мы видим из array(2) в самом начале.

Первый найти легко: [0]=> array(6)

Второй начинается в середине: [1]=> array(6)

array(2) { [0]=> array(6) { [1]=> array(10) { ["number"]=> string(2) "20" ["date"]=> int(1591463341) ["comment"]=> string(0) "" ["changes"]=> int(-42) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(92) "такое впечатление,что границу вообще не закрывали" ["last_comment_author"]=> string(8) "Влад" ["last_comment_date"]=> int(1588197557) ["waiting"]=> int(24) } [2]=> array(10) { ["number"]=> string(2) "32" ["date"]=> int(1591463341) ["comment"]=> string(0) "" ["changes"]=> int(-104) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(64) "Вы чего тут устроили епта!!! Балбесы" ["last_comment_author"]=> string(10) "Питер" ["last_comment_date"]=> int(1588933960) ["waiting"]=> int(39) } [3]=> array(10) { ["number"]=> string(2) "25" ["date"]=> int(1591463341) ["comment"]=> string(0) "" ["changes"]=> int(-70) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(108) "Добрый у-ух быдляк , так написано на Авито в твоём аккаунте )" ["last_comment_author"]=> string(20) "Спикулянты" ["last_comment_date"]=> int(1588846590) ["waiting"]=> int(30) } [4]=> array(9) { ["number"]=> string(1) "0" ["date"]=> int(1588936389) ["comment"]=> string(105) "Добрый У-ух мой друг поедет до 1.06. Его номер +358469588173 Виктор" ["changes"]=> int(0) ["author"]=> string(23) "Водитель фур" ["url"]=> string(0) "" ["last_comment"]=> string(86) "Павел долбоеб....у него в часах 69 минут....Долбоеб" ["last_comment_author"]=> string(10) "Сашок" ["last_comment_date"]=> int(1587026039) } [5]=> array(9) { ["number"]=> string(1) "3" ["date"]=> int(1585747377) ["comment"]=> string(250) "Ахмет с Махараджой все попутали и теперь на Вяртсиля катают друг друга до дыма. А мой самокат Махарадже надоел. Я в депрессии на Вяртсиля." ["changes"]=> int(1) ["author"]=> string(10) "Павел" ["url"]=> string(0) "" ["last_comment"]=> string(108) "Добрый у-ух быдляк , так написано на Авито в твоём аккаунте )" ["last_comment_author"]=> string(20) "Спикулянты" ["last_comment_date"]=> int(1588846548) } [6]=> array(9) { ["number"]=> string(1) "5" ["date"]=> int(1584625270) ["comment"]=> string(141) "Добрый У-ух пей сое флейринг на Бруснике и жди по 5 часов проехать обе границы" ["changes"]=> int(1) ["author"]=> string(10) "Павел" ["url"]=> string(0) "" ["last_comment"]=> string(174) "Спасибо, мужчины!!! Не съездить к Финам, так хоть похихикать))) Павлу отдельное спасибо за кипешь)" ["last_comment_author"]=> string(8) "Инна" ["last_comment_date"]=> int(1584975321) } } [1]=> array(6) { [1]=> array(10) { ["number"]=> string(2) "24" ["date"]=> int(1591463341) ["comment"]=> string(0) "" ["changes"]=> int(4) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(182) "Здравствуйте всем кто в пути... Пропускают ли с двумя паспортами в Россию? Ответьте пожалуйста без ..." ["last_comment_author"]=> string(10) "Римма" ["last_comment_date"]=> int(1588256835) ["waiting"]=> int(29) } [2]=> array(10) { ["number"]=> string(2) "45" ["date"]=> int(1591463341) ["comment"]=> string(0) "" ["changes"]=> int(21) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(149) "Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно..." ["last_comment_author"]=> string(6) "оля" ["last_comment_date"]=> int(1586265072) ["waiting"]=> int(54) } [3]=> array(10) { ["number"]=> string(2) "10" ["date"]=> int(1591463341) ["comment"]=> string(0) "" ["changes"]=> int(0) ["author"]=> string(19) "granitsa-online.com" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(126) "Лиза,позвоните на таможню,вы уже одно и тоже третий день спрашиваете." ["last_comment_author"]=> string(6) "Galina" ["last_comment_date"]=> int(1584714680) ["waiting"]=> int(12) } [4]=> array(9) { ["number"]=> string(1) "0" ["date"]=> int(1590423782) ["comment"]=> string(80) "сколько денег даёте что бы посылку забрать ?" ["changes"]=> int(0) ["author"]=> string(25) "водитель фуры" ["url"]=> string(0) "" ["last_comment"]=> string(14) "Реально" ["last_comment_author"]=> string(16) "Фантомас" ["last_comment_date"]=> int(1585069860) } [5]=> array(9) { ["number"]=> string(1) "0" ["date"]=> int(1589230261) ["comment"]=> string(30) "ЛЕГКОВОЙ ЗАКРЫТ!" ["changes"]=> int(0) ["author"]=> string(14) "Алексей" ["url"]=> string(0) "" ["last_comment"]=> string(107) "Машин не много, 10 минут простояли, поехали. Впереди 4 машины" ["last_comment_author"]=> string(6) "Yuliya" ["last_comment_date"]=> int(1578406001) } [6]=> array(9) { ["number"]=> string(1) "0" ["date"]=> int(1588339479) ["comment"]=> string(0) "" ["changes"]=> int(-70) ["author"]=> string(14) "Евгений" ["url"]=> string(0) "" ["last_comment"]=> string(71) "Приезжающих на карантин не отправляют?" ["last_comment_author"]=> string(14) "Евгений" ["last_comment_date"]=> int(1584430806) } } }

Достанем количество машин, дату, комментарий, изменение количесва, автора, и время ожидания присланые пользователем на выезде из России через Торфяновку

echo $border_obj[0][1]["number"]; echo $border_obj[0][1]["date"]; echo $border_obj[0][1]["comment"]; echo $border_obj[0][1]["changes"]; echo $border_obj[0][1]["author"]; echo $border_obj[0][1]["waiting"];

20
1591463341

-42
granitsa-online.com
24

Комментарий пуст.

Дата дана в формате epoch time. Подробнее можете прочитать в моей статье Epoch Time

Теперь повторим, но для Светогорска и на въезд в Россиию

echo $border_obj[1][6]["number"]; echo $border_obj[1][6]["date"]; echo $border_obj[1][6]["comment"]; echo $border_obj[1][6]["changes"]; echo $border_obj[1][6]["author"]; echo $border_obj[1][6]["waiting"];

0
1588339479

-70
Евгений

Если остались вопросы - смело задавайте их в комментариях.

Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: