json_decode PHP
Введение
Попробуем разобраться с обработкой JSON средствами PHP
Введение | |
Простейший JSON | |
JSON с одним вложением | |
JSON с массивом | |
Реальный пример работы с API |
Простейший 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;
{"0":{"1":{"number":"4","date":1611070259,"comment":"Очередь на час , досматривают конкретно.","changes":-6,"author":"Иван","url":"","last_comment":"Доброй дороги всем.Буду возвращаться в Финляндию на основании трудового договора. Нужен ли перевод? Спасибо.","last_comment_author":"Нина","last_comment_date":1604728739,"waiting":5},"2":{"number":"1","date":1608655613,"comment":"Ну слава богу "в гостях у сказки не закрыли ". зашевелился муравейник . Всем добра.","changes":0,"author":"Ватанен","url":"","last_comment":"Финский не у дачник решил имя сменить!) шифруется !)","last_comment_author":"Алексей","last_comment_date":1608576315,"waiting":2},"3":{"number":"0","date":1596204849,"comment":"Куплю сыр из финки, килограммовый куски - Мильбона или из Призмы, за 700","changes":-3,"author":"Антон","url":"","last_comment":"А кто не пускает? фины или наши?","last_comment_author":"Димас","last_comment_date":1606389029,"waiting":0},"4":{"number":"10","date":1606814988,"comment":"","changes":8,"author":"Rekka","url":"","last_comment":"Требуют ли погранцы тест на коронавирус с отрицательным результатом?","last_comment_author":"Дима","last_comment_date":1603370022},"5":{"number":"1","date":1601929549,"comment":"Тоже очень ждём инфо! Впускают только самих владельцев? Квартира оформлена на маму-пенсионерку, одна она не справится. Напишите, кто проехал!","changes":1,"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":"3","date":1596989427,"comment":"У нас гражд.Швеции и России. Русские номера. Измерили темп, мы заполнили бланк, что въехали. Вещей с собой не было почти. Спрашивали нас про декларируемый товар","changes":0,"author":"Татьяна Л","url":"","last_comment":"Я тоже из Швеции номера шведские","last_comment_author":"Лина","last_comment_date":1596990521,"waiting":4},"2":{"number":"10","date":1605882699,"comment":"Сыра привезите Las-valentina@yandex.ru","changes":10,"author":"Valio","url":"","last_comment":"Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно...","last_comment_author":"оля","last_comment_date":1586265072,"waiting":12},"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":"0","date":1589230261,"comment":"ЛЕГКОВОЙ ЗАКРЫТ!","changes":-240,"author":"Алексей","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":1613637312,"comment":"НА ГРАНИЦЕ ТУЧИ ХОДЯТ ХМУРО .КРАЙ СУРОВЫЙ ТИШИНОЙ ОБЪЯТ. ....ЧАСОВЫЕ РОДИНЫ СТОЯТ","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) "4" ["date"]=> int(1611070259) ["comment"]=> string(73) "Очередь на час , досматривают конкретно." ["changes"]=> int(-6) ["author"]=> string(8) "Иван" ["url"]=> string(0) "" ["last_comment"]=> string(199) "Доброй дороги всем.Буду возвращаться в Финляндию на основании трудового договора. Нужен ли перевод? Спасибо." ["last_comment_author"]=> string(8) "Нина" ["last_comment_date"]=> int(1604728739) ["waiting"]=> int(5) } [2]=> array(10) { ["number"]=> string(1) "1" ["date"]=> int(1608655613) ["comment"]=> string(155) "Ну слава богу "в гостях у сказки не закрыли ". зашевелился муравейник . Всем добра." ["changes"]=> int(0) ["author"]=> string(14) "Ватанен" ["url"]=> string(0) "" ["last_comment"]=> string(92) "Финский не у дачник решил имя сменить!) шифруется !)" ["last_comment_author"]=> string(14) "Алексей" ["last_comment_date"]=> int(1608576315) ["waiting"]=> int(2) } [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) "10" ["date"]=> int(1606814988) ["comment"]=> string(0) "" ["changes"]=> int(8) ["author"]=> string(5) "Rekka" ["url"]=> string(0) "" ["last_comment"]=> string(127) "Требуют ли погранцы тест на коронавирус с отрицательным результатом?" ["last_comment_author"]=> string(8) "Дима" ["last_comment_date"]=> int(1603370022) } [5]=> array(9) { ["number"]=> string(1) "1" ["date"]=> int(1601929549) ["comment"]=> string(257) "Тоже очень ждём инфо! Впускают только самих владельцев? Квартира оформлена на маму-пенсионерку, одна она не справится. Напишите, кто проехал!" ["changes"]=> int(1) ["author"]=> string(18) "Маргарита" ["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(1) "3" ["date"]=> int(1596989427) ["comment"]=> string(289) "У нас гражд.Швеции и России. Русские номера. Измерили темп, мы заполнили бланк, что въехали. Вещей с собой не было почти. Спрашивали нас про декларируемый товар" ["changes"]=> int(0) ["author"]=> string(17) "Татьяна Л" ["url"]=> string(0) "" ["last_comment"]=> string(59) "Я тоже из Швеции номера шведские" ["last_comment_author"]=> string(8) "Лина" ["last_comment_date"]=> int(1596990521) ["waiting"]=> int(4) } [2]=> array(10) { ["number"]=> string(2) "10" ["date"]=> int(1605882699) ["comment"]=> string(51) "Сыра привезите Las-valentina@yandex.ru" ["changes"]=> int(10) ["author"]=> string(5) "Valio" ["url"]=> string(0) "" ["last_comment"]=> string(149) "Пропускают на легковых? Есть кто проезжал? Найдите время дать ответ. Очень нужно..." ["last_comment_author"]=> string(6) "оля" ["last_comment_date"]=> int(1586265072) ["waiting"]=> int(12) } [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) "0" ["date"]=> int(1589230261) ["comment"]=> string(30) "ЛЕГКОВОЙ ЗАКРЫТ!" ["changes"]=> int(-240) ["author"]=> string(14) "Алексей" ["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(1613637312) ["comment"]=> string(145) "НА ГРАНИЦЕ ТУЧИ ХОДЯТ ХМУРО .КРАЙ СУРОВЫЙ ТИШИНОЙ ОБЪЯТ. ....ЧАСОВЫЕ РОДИНЫ СТОЯТ" ["author"]=> string(16) "ОПТИМИСТ" ["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"];
4
1611070259
Очередь на час , досматривают конкретно.
-6
Иван
5
Комментарий пуст.
Дата дана в формате 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
Евгений