json_decode PHP

Введение

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

Содержание статьи
Введение
Простейший JSON
JSON с одним вложением
JSON с массивом
Реальный пример работы с API

Простейший JSON

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

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

Cделаем 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;

{"0":{"1":{"number":"0","date":1624541966,"comment":"А что касается поездки к родственникам с ВНЖ из России?","changes":-20,"author":"Илья","url":"","last_comment":"Доброй дороги всем.Буду возвращаться в Финляндию на основании трудового договора. Нужен ли перевод? Спасибо.","last_comment_author":"Нина","last_comment_date":1604728739,"waiting":0},"2":{"number":"0","date":1624464303,"comment":"Вот тут инфа. Вроде пускают. https:\/\/m.facebook.com\/groups\/ClubFinskihDachnikov\/permalink\/4152334614786964\/?anchor_composer=false","changes":0,"author":"Dmitrii","url":"","last_comment":"Максим, ссылку то можете прислать?","last_comment_author":"Саня","last_comment_date":1624460353,"waiting":0},"3":{"number":"0","date":1596204849,"comment":"Куплю сыр из финки, килограммовый куски - Мильбона или из Призмы, за 700","changes":-3,"author":"Антон","url":"","last_comment":"А кто не пускает? фины или наши?","last_comment_author":"Димас","last_comment_date":1606389029,"waiting":0},"4":{"number":"38","date":1617655233,"comment":"может границы открыли7","changes":28,"author":"alex","url":"","last_comment":"Требуют ли погранцы тест на коронавирус с отрицательным результатом?","last_comment_author":"Дима","last_comment_date":1603370022},"5":{"number":"41","date":1627224466,"comment":"По 3 машины пускают на пост, простоять можно больше 3 часов","changes":40,"author":"Дмитрий","url":"","last_comment":"Мои друзья звонили в русскую вет. службу Иматра. Русские выпускают со справкой и документами на недвижимость. Финам этого тоже достаточно. Хочу реальных подтвеждений.","last_comment_author":"Игорь","last_comment_date":1601908944},"6":{"number":"2","date":1606678117,"comment":"Вяртсиля - Нийрала , обе границы за 10-12 мин, с Питера До Вяртсиля - 3 чача 55 мин по навигатору, дорога шикардось, просто сказка.Павел","changes":-3,"author":"Махараджа","url":"","last_comment":"Не удачник! Буду выезжать 11.11 из Иматры в РФ. Ну очень хочется встретиться с тобой . Посмотреть кто прячется за этим скупым названием) Принимаешь вызов?","last_comment_author":"Максим","last_comment_date":1604687112}},"1":{"1":{"number":"25","date":1622906089,"comment":"Очень медленно","changes":-5,"author":"Ana","url":"","last_comment":"Я тоже из Швеции номера шведские","last_comment_author":"Лина","last_comment_date":1596990521,"waiting":30},"2":{"number":"0","date":1626194200,"comment":"Никого. Финны и Русские с престрастием)","changes":0,"author":"Максим","url":"","last_comment":"Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно...","last_comment_author":"оля","last_comment_date":1586265072,"waiting":0},"3":{"number":"0","date":1602965682,"comment":"Никого! Понятно почему! Наши шерстят и взвешивают продукты) Но очень вежливы!)","changes":-6,"author":"Максим","url":"http:\/\/granitsa-online.com\/Pages\/Splash.aspx","last_comment":"Подскажите, пожалуйста, кто-нибудь въезжал в Финляндию из Швеции через северную границу с целью проехать Финляндию транзитом, чтобы в итоге въехать в Россию? Гражданство двойное, номера шведские.","last_comment_author":"Иван Петров","last_comment_date":1603563460,"waiting":0},"4":{"number":"2","date":1614455217,"comment":"Обе границы за 30 минут. Заполняем Ковидные анкеты. Русские таможенницы крайне добродушны.","changes":1,"author":"Максим","url":"","last_comment":"https:\/\/frequency-drives.ru\/printsip-ustrojstva-preobrazovatelja-chastoty\/","last_comment_author":"SCHNARR8668","last_comment_date":1611202573},"5":{"number":"6","date":1624803672,"comment":"Ехали из Швеции через Брусничное, вечером в 1900 в очереди было 3 российских и 3 финских машин. На финской границе оформление 2 минуты, на российской 2,5 часа. Для иностранцев бесплатный тест, заполнение анкет и полный досмотр машины в боксе.","changes":-7,"author":"Jurijs","url":"","last_comment":"Обновление покрытия ванн в Чебоксарах","last_comment_author":"Stivenob","last_comment_date":1614873465},"6":{"number":"0","date":1588339479,"comment":"","changes":-70,"author":"Евгений","url":"","last_comment":"Иван! В вашем случае думаю не будет абсолютно никаких проблем!)","last_comment_author":"Максим","last_comment_date":1604949362}},"":{"1":{"last_comment":"Кто нибудь просит тест на коронавирус? Если ехать из России в Финляндию?","last_comment_author":"Дима","last_comment_date":1603367970},"2":{"last_comment":"ассортимент в Raja-LIDL-DISAS оскудел.Часть витаминов теперь продается только в аптеках. за 2 недели не видел российских легковых авто ВААПЩЕ. Подъехал к шоферам из России на МАПП NUIJAMAA. Сказали что постоянно видят, как разворачивают россиян. Увы.","last_comment_author":"Финский удачник","last_comment_date":1607521425,"number":"1","date":1620329312,"comment":"За 3 недели проживания в Лаппеенранте видел всего 2 машины с российскими номерами . Регион 147 и 77. А тут , судя по сообщениям Максима, народ прям толпами ездит туда-сюда. Называется не верь глазам своим.","author":"Перец Болгарский","changes":0}}}

Теперь применим 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(3) { [0]=> array(6) { [1]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1624541966) ["comment"]=> string(100) "А что касается поездки к родственникам с ВНЖ из России?" ["changes"]=> int(-20) ["author"]=> string(8) "Илья" ["url"]=> string(0) "" ["last_comment"]=> string(199) "Доброй дороги всем.Буду возвращаться в Финляндию на основании трудового договора. Нужен ли перевод? Спасибо." ["last_comment_author"]=> string(8) "Нина" ["last_comment_date"]=> int(1604728739) ["waiting"]=> int(0) } [2]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1624464303) ["comment"]=> string(151) "Вот тут инфа. Вроде пускают. https://m.facebook.com/groups/ClubFinskihDachnikov/permalink/4152334614786964/?anchor_composer=false" ["changes"]=> int(0) ["author"]=> string(7) "Dmitrii" ["url"]=> string(0) "" ["last_comment"]=> string(62) "Максим, ссылку то можете прислать?" ["last_comment_author"]=> string(8) "Саня" ["last_comment_date"]=> int(1624460353) ["waiting"]=> int(0) } [3]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1596204849) ["comment"]=> string(126) "Куплю сыр из финки, килограммовый куски - Мильбона или из Призмы, за 700" ["changes"]=> int(-3) ["author"]=> string(10) "Антон" ["url"]=> string(0) "" ["last_comment"]=> string(56) "А кто не пускает? фины или наши?" ["last_comment_author"]=> string(10) "Димас" ["last_comment_date"]=> int(1606389029) ["waiting"]=> int(0) } [4]=> array(9) { ["number"]=> string(2) "38" ["date"]=> int(1617655233) ["comment"]=> string(41) "может границы открыли7" ["changes"]=> int(28) ["author"]=> string(4) "alex" ["url"]=> string(0) "" ["last_comment"]=> string(127) "Требуют ли погранцы тест на коронавирус с отрицательным результатом?" ["last_comment_author"]=> string(8) "Дима" ["last_comment_date"]=> int(1603370022) } [5]=> array(9) { ["number"]=> string(2) "41" ["date"]=> int(1627224466) ["comment"]=> string(105) "По 3 машины пускают на пост, простоять можно больше 3 часов" ["changes"]=> int(40) ["author"]=> string(14) "Дмитрий" ["url"]=> string(0) "" ["last_comment"]=> string(305) "Мои друзья звонили в русскую вет. службу Иматра. Русские выпускают со справкой и документами на недвижимость. Финам этого тоже достаточно. Хочу реальных подтвеждений." ["last_comment_author"]=> string(10) "Игорь" ["last_comment_date"]=> int(1601908944) } [6]=> array(9) { ["number"]=> string(1) "2" ["date"]=> int(1606678117) ["comment"]=> string(234) "Вяртсиля - Нийрала , обе границы за 10-12 мин, с Питера До Вяртсиля - 3 чача 55 мин по навигатору, дорога шикардось, просто сказка.Павел" ["changes"]=> int(-3) ["author"]=> string(18) "Махараджа" ["url"]=> string(0) "" ["last_comment"]=> string(274) "Не удачник! Буду выезжать 11.11 из Иматры в РФ. Ну очень хочется встретиться с тобой . Посмотреть кто прячется за этим скупым названием) Принимаешь вызов?" ["last_comment_author"]=> string(12) "Максим" ["last_comment_date"]=> int(1604687112) } } [1]=> array(6) { [1]=> array(10) { ["number"]=> string(2) "25" ["date"]=> int(1622906089) ["comment"]=> string(27) "Очень медленно" ["changes"]=> int(-5) ["author"]=> string(3) "Ana" ["url"]=> string(0) "" ["last_comment"]=> string(59) "Я тоже из Швеции номера шведские" ["last_comment_author"]=> string(8) "Лина" ["last_comment_date"]=> int(1596990521) ["waiting"]=> int(30) } [2]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1626194200) ["comment"]=> string(71) "Никого. Финны и Русские с престрастием)" ["changes"]=> int(0) ["author"]=> string(12) "Максим" ["url"]=> string(0) "" ["last_comment"]=> string(149) "Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно..." ["last_comment_author"]=> string(6) "оля" ["last_comment_date"]=> int(1586265072) ["waiting"]=> int(0) } [3]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1602965682) ["comment"]=> string(141) "Никого! Понятно почему! Наши шерстят и взвешивают продукты) Но очень вежливы!)" ["changes"]=> int(-6) ["author"]=> string(12) "Максим" ["url"]=> string(44) "http://granitsa-online.com/Pages/Splash.aspx" ["last_comment"]=> string(358) "Подскажите, пожалуйста, кто-нибудь въезжал в Финляндию из Швеции через северную границу с целью проехать Финляндию транзитом, чтобы в итоге въехать в Россию? Гражданство двойное, номера шведские." ["last_comment_author"]=> string(21) "Иван Петров" ["last_comment_date"]=> int(1603563460) ["waiting"]=> int(0) } [4]=> array(9) { ["number"]=> string(1) "2" ["date"]=> int(1614455217) ["comment"]=> string(164) "Обе границы за 30 минут. Заполняем Ковидные анкеты. Русские таможенницы крайне добродушны." ["changes"]=> int(1) ["author"]=> string(12) "Максим" ["url"]=> string(0) "" ["last_comment"]=> string(74) "https://frequency-drives.ru/printsip-ustrojstva-preobrazovatelja-chastoty/" ["last_comment_author"]=> string(11) "SCHNARR8668" ["last_comment_date"]=> int(1611202573) } [5]=> array(9) { ["number"]=> string(1) "6" ["date"]=> int(1624803672) ["comment"]=> string(430) "Ехали из Швеции через Брусничное, вечером в 1900 в очереди было 3 российских и 3 финских машин. На финской границе оформление 2 минуты, на российской 2,5 часа. Для иностранцев бесплатный тест, заполнение анкет и полный досмотр машины в боксе." ["changes"]=> int(-7) ["author"]=> string(6) "Jurijs" ["url"]=> string(0) "" ["last_comment"]=> string(70) "Обновление покрытия ванн в Чебоксарах" ["last_comment_author"]=> string(8) "Stivenob" ["last_comment_date"]=> int(1614873465) } [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(114) "Иван! В вашем случае думаю не будет абсолютно никаких проблем!)" ["last_comment_author"]=> string(12) "Максим" ["last_comment_date"]=> int(1604949362) } } [""]=> array(2) { [1]=> array(3) { ["last_comment"]=> string(131) "Кто нибудь просит тест на коронавирус? Если ехать из России в Финляндию?" ["last_comment_author"]=> string(8) "Дима" ["last_comment_date"]=> int(1603367970) } [2]=> array(8) { ["last_comment"]=> string(435) "ассортимент в Raja-LIDL-DISAS оскудел.Часть витаминов теперь продается только в аптеках. за 2 недели не видел российских легковых авто ВААПЩЕ. Подъехал к шоферам из России на МАПП NUIJAMAA. Сказали что постоянно видят, как разворачивают россиян. Увы." ["last_comment_author"]=> string(29) "Финский удачник" ["last_comment_date"]=> int(1607521425) ["number"]=> string(1) "1" ["date"]=> int(1620329312) ["comment"]=> string(363) "За 3 недели проживания в Лаппеенранте видел всего 2 машины с российскими номерами . Регион 147 и 77. А тут , судя по сообщениям Максима, народ прям толпами ездит туда-сюда. Называется не верь глазам своим." ["author"]=> string(31) "Перец Болгарский" ["changes"]=> int(0) } } }

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

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"];

0
1624541966
А что касается поездки к родственникам с ВНЖ из России?
-20
Илья
0

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

Дата дана в формате 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
Евгений

Статьи о PHP
Программирование на PHP
Массивы в PHP
Как отобразить время различных часовых поясов PHP
Как вставить переменную в ссылку PHP
Как получить ширину экрана с помощью PHP
Вызов функции из другого файла
Premature end of chunk coded message body: closing chunk expected
Сгенерировать неповторяющиеся случайные числа PHP
Узнать свой HTTP_USER_AGENT
Сравнить две даты
Классы в PHP 8
Аутентификация и авторизация в PHP 8
Другие статьи
Блокировка PHP сессий
Установка PHP-фреймворков
Установка Yii
Установка Symfony
Установка Laravel
Профилирование сайтов на PHP
XDebug - дебаг и профилирование кода php (profiling)
Контакты и сотрудничество:
Рекомендую наш хостинг beget.ru
Пишите на info@urn.su если Вы:
1. Хотите написать статью для нашего сайта или перевести статью на свой родной язык.
2. Хотите разместить на сайте рекламу, подходящуюю по тематике.
3. Реклама на моём сайте имеет максимальный уровень цензуры. Если Вы увидели рекламный блок недопустимый для просмотра детьми школьного возраста, вызывающий шок или вводящий в заблуждение - пожалуйста свяжитесь с нами по электронной почте
4. Нашли на сайте ошибку, неточности, баг и т.д. ... .......
5. Статьи можно расшарить в соцсетях, нажав на иконку сети: