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":"15","date":1684692337,"comment":"Очередь машин 15 ещё до въезда на границу. Видимо надолго.","changes":-85,"author":"Alex","url":"","last_comment":"Число машин","last_comment_author":"Юрий","last_comment_date":1680502375,"traffic":null,"waiting":18},"2":{"number":"1","date":1665849031,"comment":"Отдельно для Маруси ! Если официальное разъяснение на рая.фи для вас вранье - езжайте смело. Таких как вы там финские пограничники очень рады видеть, но не долго.))","changes":-4,"author":"Читатель Бредов","url":"","last_comment":"С детьми владельцу недвижимости тоже нельзя, детям визы анулируют","last_comment_author":"Татьяна","last_comment_date":1664628584,"traffic":null,"waiting":2},"3":{"number":"0","date":1665654327,"comment":"","changes":-2,"author":"","url":"","last_comment":"нет свежих данных","last_comment_author":"","last_comment_date":1665173066,"traffic":null,"waiting":0},"4":{"number":"1","date":1664744537,"comment":"Поехали лугандоны. Достали украинские номера","changes":0,"author":"Убейдед","url":"","last_comment":"Время прохождения","last_comment_author":"Мурад","last_comment_date":1681662241,"traffic":null},"5":{"number":"5","date":1665172807,"comment":"","changes":4,"author":"","url":"","last_comment":"Пускают по туристической?","last_comment_author":"РК","last_comment_date":1664487907,"traffic":null},"6":{"number":"2","date":1666795913,"comment":"Вяртсиля, 1 машина на российской стороне, у финнов никого. Смысл ждать у Торфяновки и Брусничное не вижу, здесь всё очень быстро","changes":-8,"author":"Павел","url":"","last_comment":"Svetofora тоже не слушайте, он муд.к классный....2 года назад постоянно спрашивал как там на таможне - проверят или нет...","last_comment_author":"Павел","last_comment_date":1664548179,"traffic":null}},"1":{"1":{"number":"100","date":1680802629,"comment":"Огромная очередь от середины нейтральной зоны","changes":0,"author":"Павел","url":"","last_comment":"Очередь в рф организована на нашем кпп. Финны поэтотум не пускают","last_comment_author":"Алексей","last_comment_date":1664743981,"traffic":null,"waiting":120},"2":{"number":"14","date":1681109676,"comment":"Стоим 2 часа перед шлагбаумом возле Дьюти фри. Причина- не известна.","changes":-56,"author":"Анастасия","url":"","last_comment":"Пп","last_comment_author":"Ррпр","last_comment_date":1681898998,"traffic":null,"waiting":17},"3":{"number":"4","date":1669641671,"comment":"Финов прошли за 3 мин, наши тормозят","changes":-3,"author":"Михаил","url":"","last_comment":"никого.супер","last_comment_author":"Алексей","last_comment_date":1666720771,"traffic":null,"waiting":5},"4":{"number":"50","date":1669996380,"comment":"","changes":50,"author":"","url":"","last_comment":"За 1.10 продвинулись машин на 15, наверное. Очень медленно(( надо было на бруснику ехать","last_comment_author":"Алина","last_comment_date":1664639885,"traffic":null},"5":{"number":"1","date":1664729757,"comment":"Никого нет!!!","changes":0,"author":"Rispen","url":"","last_comment":"Число машин","last_comment_author":"Елена","last_comment_date":1664726436,"traffic":null},"6":{"number":"1","date":1664716928,"comment":"Машин нет, всё чудесно","changes":-7,"author":"Анастасия","url":"","last_comment":"На российской границе уже 1.5 часа стоим","last_comment_author":"Андрей","last_comment_date":1664133746,"traffic":null}},"":{"2":{"number":"1","traffic":null,"date":1663871951,"comment":"мне вот интересно - куда ломятся и на что надеятся те, у кого нет своей хаты в Финляндии ? нет кредиток работающих в Европе ? отсидеть максимум 90 дней и спустить всю наличку за жилье и еду ? а дальше то что???","author":"Неврубальский из ЕС"},"4":{"traffic":null,"last_comment":"Стоим в финском пункте пропуска 4 часа. Начали пускать на контроль. Видим, что разворачивают обратно.","last_comment_author":"Александр","last_comment_date":1664504992}}}
Теперь применим 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(11) { ["number"]=> string(2) "15" ["date"]=> int(1684692337) ["comment"]=> string(103) "Очередь машин 15 ещё до въезда на границу. Видимо надолго." ["changes"]=> int(-85) ["author"]=> string(4) "Alex" ["url"]=> string(0) "" ["last_comment"]=> string(21) "Число машин" ["last_comment_author"]=> string(8) "Юрий" ["last_comment_date"]=> int(1680502375) ["traffic"]=> NULL ["waiting"]=> int(18) } [2]=> array(11) { ["number"]=> string(1) "1" ["date"]=> int(1665849031) ["comment"]=> string(296) "Отдельно для Маруси ! Если официальное разъяснение на рая.фи для вас вранье - езжайте смело. Таких как вы там финские пограничники очень рады видеть, но не долго.))" ["changes"]=> int(-4) ["author"]=> string(29) "Читатель Бредов" ["url"]=> string(0) "" ["last_comment"]=> string(121) "С детьми владельцу недвижимости тоже нельзя, детям визы анулируют" ["last_comment_author"]=> string(14) "Татьяна" ["last_comment_date"]=> int(1664628584) ["traffic"]=> NULL ["waiting"]=> int(2) } [3]=> array(11) { ["number"]=> string(1) "0" ["date"]=> int(1665654327) ["comment"]=> string(0) "" ["changes"]=> int(-2) ["author"]=> string(0) "" ["url"]=> string(0) "" ["last_comment"]=> string(32) "нет свежих данных" ["last_comment_author"]=> string(0) "" ["last_comment_date"]=> int(1665173066) ["traffic"]=> NULL ["waiting"]=> int(0) } [4]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1664744537) ["comment"]=> string(83) "Поехали лугандоны. Достали украинские номера" ["changes"]=> int(0) ["author"]=> string(14) "Убейдед" ["url"]=> string(0) "" ["last_comment"]=> string(33) "Время прохождения" ["last_comment_author"]=> string(10) "Мурад" ["last_comment_date"]=> int(1681662241) ["traffic"]=> NULL } [5]=> array(10) { ["number"]=> string(1) "5" ["date"]=> int(1665172807) ["comment"]=> string(0) "" ["changes"]=> int(4) ["author"]=> string(0) "" ["url"]=> string(0) "" ["last_comment"]=> string(47) "Пускают по туристической?" ["last_comment_author"]=> string(4) "РК" ["last_comment_date"]=> int(1664487907) ["traffic"]=> NULL } [6]=> array(10) { ["number"]=> string(1) "2" ["date"]=> int(1666795913) ["comment"]=> string(231) "Вяртсиля, 1 машина на российской стороне, у финнов никого. Смысл ждать у Торфяновки и Брусничное не вижу, здесь всё очень быстро" ["changes"]=> int(-8) ["author"]=> string(10) "Павел" ["url"]=> string(0) "" ["last_comment"]=> string(206) "Svetofora тоже не слушайте, он муд.к классный....2 года назад постоянно спрашивал как там на таможне - проверят или нет..." ["last_comment_author"]=> string(10) "Павел" ["last_comment_date"]=> int(1664548179) ["traffic"]=> NULL } } [1]=> array(6) { [1]=> array(11) { ["number"]=> string(3) "100" ["date"]=> int(1680802629) ["comment"]=> string(85) "Огромная очередь от середины нейтральной зоны" ["changes"]=> int(0) ["author"]=> string(10) "Павел" ["url"]=> string(0) "" ["last_comment"]=> string(119) "Очередь в рф организована на нашем кпп. Финны поэтотум не пускают" ["last_comment_author"]=> string(14) "Алексей" ["last_comment_date"]=> int(1664743981) ["traffic"]=> NULL ["waiting"]=> int(120) } [2]=> array(11) { ["number"]=> string(2) "14" ["date"]=> int(1681109676) ["comment"]=> string(122) "Стоим 2 часа перед шлагбаумом возле Дьюти фри. Причина- не известна." ["changes"]=> int(-56) ["author"]=> string(18) "Анастасия" ["url"]=> string(0) "" ["last_comment"]=> string(4) "Пп" ["last_comment_author"]=> string(8) "Ррпр" ["last_comment_date"]=> int(1681898998) ["traffic"]=> NULL ["waiting"]=> int(17) } [3]=> array(11) { ["number"]=> string(1) "4" ["date"]=> int(1669641671) ["comment"]=> string(64) "Финов прошли за 3 мин, наши тормозят" ["changes"]=> int(-3) ["author"]=> string(12) "Михаил" ["url"]=> string(0) "" ["last_comment"]=> string(23) "никого.супер" ["last_comment_author"]=> string(14) "Алексей" ["last_comment_date"]=> int(1666720771) ["traffic"]=> NULL ["waiting"]=> int(5) } [4]=> array(10) { ["number"]=> string(2) "50" ["date"]=> int(1669996380) ["comment"]=> string(0) "" ["changes"]=> int(50) ["author"]=> string(0) "" ["url"]=> string(0) "" ["last_comment"]=> string(153) "За 1.10 продвинулись машин на 15, наверное. Очень медленно(( надо было на бруснику ехать" ["last_comment_author"]=> string(10) "Алина" ["last_comment_date"]=> int(1664639885) ["traffic"]=> NULL } [5]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1664729757) ["comment"]=> string(22) "Никого нет!!!" ["changes"]=> int(0) ["author"]=> string(6) "Rispen" ["url"]=> string(0) "" ["last_comment"]=> string(21) "Число машин" ["last_comment_author"]=> string(10) "Елена" ["last_comment_date"]=> int(1664726436) ["traffic"]=> NULL } [6]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1664716928) ["comment"]=> string(40) "Машин нет, всё чудесно" ["changes"]=> int(-7) ["author"]=> string(18) "Анастасия" ["url"]=> string(0) "" ["last_comment"]=> string(71) "На российской границе уже 1.5 часа стоим" ["last_comment_author"]=> string(12) "Андрей" ["last_comment_date"]=> int(1664133746) ["traffic"]=> NULL } } [""]=> array(2) { [2]=> array(5) { ["number"]=> string(1) "1" ["traffic"]=> NULL ["date"]=> int(1663871951) ["comment"]=> string(370) "мне вот интересно - куда ломятся и на что надеятся те, у кого нет своей хаты в Финляндии ? нет кредиток работающих в Европе ? отсидеть максимум 90 дней и спустить всю наличку за жилье и еду ? а дальше то что???" ["author"]=> string(36) "Неврубальский из ЕС" } [4]=> array(4) { ["traffic"]=> NULL ["last_comment"]=> string(183) "Стоим в финском пункте пропуска 4 часа. Начали пускать на контроль. Видим, что разворачивают обратно." ["last_comment_author"]=> string(18) "Александр" ["last_comment_date"]=> int(1664504992) } } }
Достанем количество машин, дату, комментарий, изменение количества, автора, и время ожидания присланые пользователем на выезде из России через Торфяновку
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"];
15
1684692337
Очередь машин 15 ещё до въезда на границу. Видимо надолго.
-85
Alex
18
Комментарий пуст.
Дата дана в формате 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"];
1
1664716928
Машин нет, всё чудесно
-7
Анастасия