json_decode PHP
Введение | |
Простейший JSON | |
JSON с одним вложением | |
JSON с массивом | |
Реальный пример работы с API | |
Похожие статьи |
Введение
Попробуем разобраться с обработкой JSON средствами PHP
Простейший JSON
Предположим, что у нас есть следующий JSON
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'
Cделаем json_decode без дополнительных параметров
var_dump(json_decode($json));
object(stdClass)#4 (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":"5","date":1656913540,"comment":"Почти никого","changes":2,"author":"Дедушка","url":"","last_comment":"А с лайтом пускают?","last_comment_author":"Светлана","last_comment_date":1637406861,"waiting":6},"2":{"number":"0","date":1656613821,"comment":"Например вывоз коптеров, рыболовного оборудования, .. и товаров стоимостью свыше 750€ Запрещён","changes":0,"author":"Макс","url":"","last_comment":"Максим, ссылку то можете прислать?","last_comment_author":"Саня","last_comment_date":1624463953,"waiting":0},"3":{"number":"3","date":1594622641,"comment":"пускают птицы, которые летают в небе","changes":-39,"author":"Петр","url":"","last_comment":"А кто не пускает? фины или наши?","last_comment_author":"Димас","last_comment_date":1606396229,"waiting":4},"4":{"number":"4","date":1656491678,"comment":"Машин пока мало","changes":-1,"author":"КФС","url":"","last_comment":"Требуют ли погранцы тест на коронавирус с отрицательным результатом?","last_comment_author":"Дима","last_comment_date":1603373622},"5":{"number":"25","date":1635530244,"comment":"25 машин, но очередь длинная, так надо ждать пока кому надо тест сделают.","changes":24,"author":"Игорь","url":"","last_comment":"Мои друзья звонили в русскую вет. службу Иматра. Русские выпускают со справкой и документами на недвижимость. Финам этого тоже достаточно. Хочу реальных подтвеждений.","last_comment_author":"Игорь","last_comment_date":1601912544},"6":{"number":"5","date":1584472685,"comment":"❗Иностранные граждане находящиеся на территории Финляндии могут свободно покинуть её после 19.3. Граждане РФ могут это сделать на а\/м (Иматра - на велосипеде)","changes":0,"author":"Хорь","url":"","last_comment":"Не удачник! Буду выезжать 11.11 из Иматры в РФ. Ну очень хочется встретиться с тобой . Посмотреть кто прячется за этим скупым названием) Принимаешь вызов?","last_comment_author":"Максим","last_comment_date":1604694312}},"1":{"1":{"number":"5","date":1656700756,"comment":"","changes":-195,"author":"ГражданинМира","url":"","last_comment":"Приехали на торфяновку в 7.10. До перерыва прошла одна машина. Вообще не хотят работать","last_comment_author":"Борис","last_comment_date":1635054879,"waiting":6},"2":{"number":"12","date":1636315264,"comment":"Осторожно между Финляндией Россией машина разбилась об лося, на аварийках стоит.","changes":12,"author":"Игорь","url":"","last_comment":"Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно...","last_comment_author":"оля","last_comment_date":1586268672,"waiting":15},"3":{"number":"0","date":1602969282,"comment":"Никого! Понятно почему! Наши шерстят и взвешивают продукты) Но очень вежливы!)","changes":-6,"author":"Максим","url":"","last_comment":"Подскажите, пожалуйста, кто-нибудь въезжал в Финляндию из Швеции через северную границу с целью проехать Финляндию транзитом, чтобы в итоге въехать в Россию? Гражданство двойное, номера шведские.","last_comment_author":"Иван Петров","last_comment_date":1603567060,"waiting":0},"4":{"number":"2","date":1614462417,"comment":"Обе границы за 30 минут. Заполняем Ковидные анкеты. Русские таможенницы крайне добродушны.","changes":1,"author":"Максим","url":"","last_comment":"Число машин в очереди, длинна очереди","last_comment_author":"reks2358@gmail.com","last_comment_date":1656854547},"5":{"number":"6","date":1624807272,"comment":"Ехали из Швеции через Брусничное, вечером в 1900 в очереди было 3 российских и 3 финских машин. На финской границе оформление 2 минуты, на российской 2,5 часа. Для иностранцев бесплатный тест, заполнение анкет и полный досмотр машины в боксе.","changes":-7,"author":"Jurijs","url":"","last_comment":"Машин не много, 10 минут простояли, поехали. Впереди 4 машины","last_comment_author":"Yuliya","last_comment_date":1578413201},"6":{"number":"0","date":1588343079,"comment":"","changes":-70,"author":"Евгений","url":"","last_comment":"Иван! В вашем случае думаю не будет абсолютно никаких проблем!)","last_comment_author":"Максим","last_comment_date":1604956562}},"":{"2":{"number":17,"date":1656961412,"comment":"","author":"Игорь"}}}
Теперь применим 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) "5" ["date"]=> int(1656913540) ["comment"]=> string(23) "Почти никого" ["changes"]=> int(2) ["author"]=> string(14) "Дедушка" ["url"]=> string(0) "" ["last_comment"]=> string(34) "А с лайтом пускают?" ["last_comment_author"]=> string(16) "Светлана" ["last_comment_date"]=> int(1637406861) ["waiting"]=> int(6) } [2]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1656613821) ["comment"]=> string(171) "Например вывоз коптеров, рыболовного оборудования, .. и товаров стоимостью свыше 750€ Запрещён" ["changes"]=> int(0) ["author"]=> string(8) "Макс" ["url"]=> string(0) "" ["last_comment"]=> string(62) "Максим, ссылку то можете прислать?" ["last_comment_author"]=> string(8) "Саня" ["last_comment_date"]=> int(1624463953) ["waiting"]=> int(0) } [3]=> array(10) { ["number"]=> string(1) "3" ["date"]=> int(1594622641) ["comment"]=> string(66) "пускают птицы, которые летают в небе" ["changes"]=> int(-39) ["author"]=> string(8) "Петр" ["url"]=> string(0) "" ["last_comment"]=> string(56) "А кто не пускает? фины или наши?" ["last_comment_author"]=> string(10) "Димас" ["last_comment_date"]=> int(1606396229) ["waiting"]=> int(4) } [4]=> array(9) { ["number"]=> string(1) "4" ["date"]=> int(1656491678) ["comment"]=> string(28) "Машин пока мало" ["changes"]=> int(-1) ["author"]=> string(6) "КФС" ["url"]=> string(0) "" ["last_comment"]=> string(127) "Требуют ли погранцы тест на коронавирус с отрицательным результатом?" ["last_comment_author"]=> string(8) "Дима" ["last_comment_date"]=> int(1603373622) } [5]=> array(9) { ["number"]=> string(2) "25" ["date"]=> int(1635530244) ["comment"]=> string(129) "25 машин, но очередь длинная, так надо ждать пока кому надо тест сделают." ["changes"]=> int(24) ["author"]=> string(10) "Игорь" ["url"]=> string(0) "" ["last_comment"]=> string(305) "Мои друзья звонили в русскую вет. службу Иматра. Русские выпускают со справкой и документами на недвижимость. Финам этого тоже достаточно. Хочу реальных подтвеждений." ["last_comment_author"]=> string(10) "Игорь" ["last_comment_date"]=> int(1601912544) } [6]=> array(9) { ["number"]=> string(1) "5" ["date"]=> int(1584472685) ["comment"]=> string(286) "❗Иностранные граждане находящиеся на территории Финляндии могут свободно покинуть её после 19.3. Граждане РФ могут это сделать на а/м (Иматра - на велосипеде)" ["changes"]=> int(0) ["author"]=> string(8) "Хорь" ["url"]=> string(0) "" ["last_comment"]=> string(274) "Не удачник! Буду выезжать 11.11 из Иматры в РФ. Ну очень хочется встретиться с тобой . Посмотреть кто прячется за этим скупым названием) Принимаешь вызов?" ["last_comment_author"]=> string(12) "Максим" ["last_comment_date"]=> int(1604694312) } } [1]=> array(6) { [1]=> array(10) { ["number"]=> string(1) "5" ["date"]=> int(1656700756) ["comment"]=> string(0) "" ["changes"]=> int(-195) ["author"]=> string(26) "ГражданинМира" ["url"]=> string(0) "" ["last_comment"]=> string(155) "Приехали на торфяновку в 7.10. До перерыва прошла одна машина. Вообще не хотят работать" ["last_comment_author"]=> string(10) "Борис" ["last_comment_date"]=> int(1635054879) ["waiting"]=> int(6) } [2]=> array(10) { ["number"]=> string(2) "12" ["date"]=> int(1636315264) ["comment"]=> string(148) "Осторожно между Финляндией Россией машина разбилась об лося, на аварийках стоит." ["changes"]=> int(12) ["author"]=> string(10) "Игорь" ["url"]=> string(0) "" ["last_comment"]=> string(149) "Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно..." ["last_comment_author"]=> string(6) "оля" ["last_comment_date"]=> int(1586268672) ["waiting"]=> int(15) } [3]=> array(10) { ["number"]=> string(1) "0" ["date"]=> int(1602969282) ["comment"]=> string(141) "Никого! Понятно почему! Наши шерстят и взвешивают продукты) Но очень вежливы!)" ["changes"]=> int(-6) ["author"]=> string(12) "Максим" ["url"]=> string(0) "" ["last_comment"]=> string(358) "Подскажите, пожалуйста, кто-нибудь въезжал в Финляндию из Швеции через северную границу с целью проехать Финляндию транзитом, чтобы в итоге въехать в Россию? Гражданство двойное, номера шведские." ["last_comment_author"]=> string(21) "Иван Петров" ["last_comment_date"]=> int(1603567060) ["waiting"]=> int(0) } [4]=> array(9) { ["number"]=> string(1) "2" ["date"]=> int(1614462417) ["comment"]=> string(164) "Обе границы за 30 минут. Заполняем Ковидные анкеты. Русские таможенницы крайне добродушны." ["changes"]=> int(1) ["author"]=> string(12) "Максим" ["url"]=> string(0) "" ["last_comment"]=> string(68) "Число машин в очереди, длинна очереди" ["last_comment_author"]=> string(18) "reks2358@gmail.com" ["last_comment_date"]=> int(1656854547) } [5]=> array(9) { ["number"]=> string(1) "6" ["date"]=> int(1624807272) ["comment"]=> string(430) "Ехали из Швеции через Брусничное, вечером в 1900 в очереди было 3 российских и 3 финских машин. На финской границе оформление 2 минуты, на российской 2,5 часа. Для иностранцев бесплатный тест, заполнение анкет и полный досмотр машины в боксе." ["changes"]=> int(-7) ["author"]=> string(6) "Jurijs" ["url"]=> string(0) "" ["last_comment"]=> string(107) "Машин не много, 10 минут простояли, поехали. Впереди 4 машины" ["last_comment_author"]=> string(6) "Yuliya" ["last_comment_date"]=> int(1578413201) } [6]=> array(9) { ["number"]=> string(1) "0" ["date"]=> int(1588343079) ["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(1604956562) } } [""]=> array(1) { [2]=> array(4) { ["number"]=> int(17) ["date"]=> int(1656961412) ["comment"]=> string(0) "" ["author"]=> string(10) "Игорь" } } }
Достанем количество машин, дату, комментарий, изменение количества, автора, и время ожидания присланые пользователем на выезде из России через Торфяновку
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"];
5
1656913540
Почти никого
2
Дедушка
6
Комментарий пуст.
Дата дана в формате 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
1588343079
-70
Евгений