Парсинг json php: PHP: json_decode — Manual
Содержание
массивы — Рациональный парсинг JSON в PHP
Я хочу найти наиболее рациональный способ парсинга JSON в PHP.
К примеру, у меня есть данный array:
{ "response": { "count": 254, "items": [ { "album_id": 136592355, "date": 1525617677, "id": 456317315, "owner_id": 1, "sizes": [ { "height": 130, "type": "m", "width": 93, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=93x130&quality=96&sign=25840dcf9a57237ca0083d2f37151218&c_uniq_tag=U_3djTlFZEsWZj0mNQb_mUcxKGDGleSDROhOQVq4YCA&type=album" }, { "height": 182, "type": "o", "width": 130, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=130x182&quality=96&sign=194c357af456444813877f8f6bec415a&c_uniq_tag=Nbd8j4TtfPnIvrrJIAqh5YCwWcpzT81cwuJ0G_E3PnQ&type=album" }, { "height": 280, "type": "p", "width": 200, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=200x280&quality=96&sign=2beda67edd76f9ed26402b2918efa674&c_uniq_tag=X3WUcU8dG3RAPYn16qYFgmyk-An2tKbUXeLf9657nO4&type=album" }, { "height": 448, "type": "q", "width": 320, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=320x448&quality=96&sign=d7f7121f7b9b1b8fd5be57929a294172&c_uniq_tag=RPGFUCvQbO10ilzDbmif996s_UP2eSAxIGpnb8gIAQY&type=album" }, { "height": 714, "type": "r", "width": 510, "url": "https://sun9-79.
userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=510x714&quality=96&sign=1448b56618ef2f7d298ad7c8c164e58e&c_uniq_tag=1tKgre46e-UZGwr5k1La7VsLqigsC0uOm8ceMYbwyC0&type=album" }, { "height": 75, "type": "s", "width": 54, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=54x75&quality=96&sign=ab19e0a96214b0322dad1f5b755905c3&c_uniq_tag=hCYdPwoGo142KMD_5AwEdTnpHtz4e219ory4VVEXGiY&type=album" }, { "height": 2160, "type": "w", "width": 1542, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=1542x2160&quality=96&sign=fa901c0d7d0840caf9408613c1a7c748&c_uniq_tag=LHr5untkXk4x_aciMu4T2IBNo7irMpZlCAnEnAEA2q0&type=album" }, { "height": 604, "type": "x", "width": 431, "url": "https://sun9-79.
userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=431x604&quality=96&sign=0c1022ae6a5a72eac5093e68c00d706b&c_uniq_tag=Hu6BFUhQen1i4O7OdYiJPj3ZEqgR96u2YhcSrmc0GDM&type=album" }, { "height": 807, "type": "y", "width": 576, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=576x807&quality=96&sign=dba71203afe7f0991ce093963d9a2733&c_uniq_tag=UPAVD1v4G--Vuef0G0GGqwotKcYhin_kdDL4HzYZVgM&type=album" }, { "height": 1080, "type": "z", "width": 771, "url": "https://sun9-79.userapi.com/impf/rD7Ugfhcf7bKIJ4-d8l8I-RkaTwVN-IRoxt9sg/heuH_mKDOcY.jpg?size=771x1080&quality=96&sign=081954f67c15e03ffdfe34f3673040f1&c_uniq_tag=6NcO4EJFHWezJx-5YYP78qVl0ULkph5ec_eQFghoSBI&type=album" } ], "text": "", "has_tags": false }, { "album_id": 136592355, "date": 1525188135, "id": 456316251, "owner_id": 1, "sizes": [ { "height": 65, "type": "m", "width": 130, "url": "https://sun9-15.
userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=130x65&quality=96&sign=fede3b8790b0fca4efcd091f37954000&c_uniq_tag=qtVBxMeog_-g8EppDEfE6arzHLAntVo8irWkGzrI4G0&type=album" }, { "height": 87, "type": "o", "width": 130, "url": "https://sun9-15.userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=130x87&quality=96&crop=253,0,1494,1000&sign=19d5a3bbe414e842d2ebdf4d2be9c0d4&c_uniq_tag=o80KE15kQ-KZw5_hDVDC4Rwj_hnUds2BLgA1JaE92NU&type=album" }, { "height": 133, "type": "p", "width": 200, "url": "https://sun9-15.userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=200x133&quality=96&crop=248,0,1504,1000&sign=b7e628ee9276f48353a5937f488c99ea&c_uniq_tag=QVlgb1lu817EnO6b6hiUgNxYV4qD5JRIdGC3ahrNrvs&type=album" }, { "height": 213, "type": "q", "width": 320, "url": "https://sun9-15.
userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=320x213&quality=96&crop=249,0,1502,1000&sign=00e3a14433561146d8d68fbc847c1482&c_uniq_tag=4zCBYq3cNLvu4fkbIWinvi-q1FcujCrnYnXEif2n5WQ&type=album" }, { "height": 340, "type": "r", "width": 510, "url": "https://sun9-15.userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=510x340&quality=96&crop=250,0,1500,1000&sign=a0e35670dcf22f0f9540359ba89c08c0&c_uniq_tag=vA_N9phQo7fQw2ciFfmjF3a95N9RJOq5F0bBZ08wXZc&type=album" }, { "height": 37, "type": "s", "width": 75, "url": "https://sun9-15.userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=75x37&quality=96&sign=671064fb7acb882411e7c0226505af85&c_uniq_tag=4Cx-S7aK9HDMp5rXzRBaqqxn0D1KkX8mB_xQdPph5iM&type=album" }, { "height": 1000, "type": "w", "width": 2000, "url": "https://sun9-15.
userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=2000x1000&quality=96&sign=facdf2117da4a44229c56a4ed69069b3&c_uniq_tag=xwBfpUO_MWGKcktD3HXcyhCvnhlKiHBl6TaIXV2oXW8&type=album" }, { "height": 302, "type": "x", "width": 604, "url": "https://sun9-15.userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=604x302&quality=96&sign=d6cb89cea1b40ae45046c248e2c41bef&c_uniq_tag=6Z3KGzuuOc4huDIoDh8MwuRxgrhJ0c4GDhOMxCmGj9Y&type=album" }, { "height": 403, "type": "y", "width": 807, "url": "https://sun9-15.userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=807x403&quality=96&sign=1597306a368ccaadf776ad81f9b4b770&c_uniq_tag=2a93leFt5CKLHzVN_aO4udEnejtRIBEHQPldFO9NoHg&type=album" }, { "height": 640, "type": "z", "width": 1280, "url": "https://sun9-15.
userapi.com/impf/c830408/v830408095/e9b55/VSGEsuDKwUE.jpg?size=1280x640&quality=96&sign=073fa390aaa25fc7efc3d1ddb3605c10&c_uniq_tag=Q3AO0UPlt9CQKCqbPPCTzbej_xkWJHnwJskZmpXapG4&type=album" } ], "text": "", "has_tags": false } ] }
}
Мне нужен код, который будет выводить все url с «type» : «m», но так чтобы этот код не выглядел как:
foreach(){ foreach(){ foreach(){ foreach(){ foreach(){ } } } } }
А чтобы это была универсальная функция, которая искала бы в array указанный объект без кучи циклов и огромного количества постоянно повторяющегося кода для каждого запроса…
Парсинг больших JSON
Недавно потребовалось с помощью PHP импортировать в БД содержимое gzip-архива с json-файлом. В нём был массив некоторых однотипных объектов. Всё бы ничего, но размер архива 8ГБ, а файла в нём — 212ГБ. Mongo и т.п. не были доступны, только MySQL и PHP. А ещё на сервере не было достаточно места для распаковки архива.
Первым делом, я узнал о том, что для gzip информация о размере сжатого файла хранится в заголовке архива и может не соответствовать действительности. Т.е. вы не узнаете настоящего размера файла до окончания распаковки. Потом почитал о том, как люди решали подобные проблемы. Конечно же, крупные файлы в оперативную память никто не грузил. Вместо этого их парсили налету, читая один объект за другим.
Действительно, если условиться, что в json хранится массив, то его элементы можно читать последовательно, не храня в памяти весь файл и не пытаясь декодировать исходные данные целиком. В интернете уже есть несколько подходящих библиотек для PHP, например, salsify/jsonstreamingparser или MAXakaWIZARD/JsonCollectionParser, расширяющая первую. Они используют как раз такой принцип, однако мне не подошли, т.к. в секунду получалось обрабатывать всего два объекта. Этому есть две причины и обе видны на фрагменте кода ниже:
Во-первых, накапливание буфера чтения выполняется для каждого символа в строке. Как мы помним, входные данные могут занимать сотни гигабайт и переприсваивать многомегабайтные строки только для того, чтобы добавить к ним ещё один символ, нерационально. Во-вторых, реализовать полную логику парсинга JSON — это конечно хорошо и профессионально. Всегда лучше с недоверием относиться к входным данным и быть уверенным, что перед нами валидный текст. Но давайте будем реалистами. Мы получаем от партнёра дамп, в целостности которого он уверен. Да и найденный объект из текста всё равно будет десериализовывать функция
json_decode()
, а она от невалидных данных вернёт null
, что очень легко отследить.
Чтобы избежать распаковки гигантского файла, я использовал функцию gzread(), она почти идентична fread(), в частности, нормально читает несжатые файлы.
Парсинг получаемого текста тоже можно упростить и ускорить. Нам достаточно искать для каждой открывающей объект скобки {
её закрывающую пару }
, затем функцией получения подстроки substr()
брать весь текст между ними и передавать в json_decode()
. Так мы избавимся от N переприсваиваний огромных строк и сложного парсинга объекта, который всё равно будет повторяться при декодировании модулем JSON
Так получилась небольшая библиотека va-fursenko/JsonFileParser (composer require viktorf/json-file-parser
).
Она состоит из простого класса Parser и интерфейса Listener, который должен реализовывать обработчик найденных объектов. Используется всё достаточно просто:
Теперь каждый найденный в файле объект будет обрабатываться слушателем, а в оперативной памяти одновременно будет храниться не больше $readBufferSize
или максимальной длины текста с одним сериализованным объектом, в зависимости от того, что больше. Для оптимальной производительности лучше, если в одном $readBufferSize
будет помещаться несколько объектов.
Для чего не подойдёт такое решение? Для разных хитрых невалидных входных данных, которые и так невозможно распознать любым способом. Во всех остальных случаях ускоренный парсинг и возможность доступа к архивам любой длины могут здорово выручить. В моём случае сжатый файл с более, чем миллионом объектов был успешно распознан на скорости примерно в 10 раз быстрее, чем для указанных выше библиотек.
Благодарю за внимание и удачных импортов!
Как я могу разобрать файл JSON с помощью PHP
Нет ответа на этот вопрос. Будьте первыми, кто откликнется.
Ваш ответ
Связанные вопросы в PHP
Привет @картик,
Для «долгоживущего соединения» вы можете … ПОДРОБНЕЕ
ответил
24 августа 2020 г.
в PHP
к
Нирой
• 82 860 баллов
•
2314 просмотров
- PHP
- HTML
- CSS
- JavaScript
- ларавель
Привет,
Вы можете сделать что-то подобное, чтобы … ПОДРОБНЕЕ
ответил
10 ноября 2020 г.
в PHP
к
Нирой
• 82 860 баллов
•
4422 просмотра
- HTML
- CSS
- JavaScript
- ларавель
- PHP
Привет @картик,
mime_content_type() устарела, поэтому вы не будете . .. ПОДРОБНЕЕ
ответил
16 ноября 2020 г.
в PHP
к
Нирой
• 82 860 баллов
•
2037 просмотров
- HTML
- CSS
- JavaScript
- ларавель
- PHP
Привет @картик,
Протестируйте разные порты:
$ждите = 1; // … ПОДРОБНЕЕ
ответил
19 нояб. 2020 г.
в PHP
к
Нирой
• 82 860 баллов
•
2,291 просмотр
- HTML
- CSS
- JavaScript
- ларавель
- PHP
Привет,
Попробуй это :
echo exec(‘ping -n 1 -w … ПОДРОБНЕЕ
ответил
22 нояб. 2020 г.
в PHP
к
Нирой
• 82 860 баллов
•
7 124 просмотра
- HTML
- CSS
- JavaScript
- ларавель
- PHP
Это моя карта изображений:
<имя карты="заморожено">
… ПОДРОБНЕЕ
16 июня 2022 г.
в PHP
к
нариккадан
• 63 080 баллов
•
612 просмотров
- JavaScript
- PHP
- HTML
- sql
- карта изображений
Преобразуйте json-строку в php-массив и. .. ПОДРОБНЕЕ
ответил
11 сентября 2018 г.
в блокчейне
к
убийца
• 29 350 баллов
•
2313 просмотров
- блокчейн
- биткойн
- json
- PHP
Все, что вам нужно сделать, это изменить … ПОДРОБНЕЕ
ответил
12 сентября 2018 г.
в блокчейне
к
копатель
• 26 740 баллов
•
394 просмотра
- блокчейн
- биткойн
- json
- PHP
После того, как apiv2.bitcoinaverage.com перестал быть бесплатным, я … ПОДРОБНЕЕ
2 марта 2022 г.
в блокчейне
к
Адитья
• 7 680 баллов
•
675 просмотров
- PHP
- json
Если не ошибаюсь, это что… ПОДРОБНЕЕ
ответил
7 апр. 2022 г.
в блокчейне
к
Адитья
• 7 680 баллов
•
1863 просмотра
- PHP
- json
- Что такое PHPSESSID? 8 августа 2022 г.
- getenv() против $_ENV в PHP 8 августа 2022 г.
- Как сделать хороший «выбор даты» в PHP? 8 августа 2022 г.
- Интерфейс или абстрактный класс: что использовать? 8 августа 2022 г.
- Как добавить дополнительные пробелы в PHP? 8 августа 2022 г.
- Все категории
- ЧатGPT
(11) - Апач Кафка
(84) - Апач Спарк
(596) - Лазурный
(145) - Большие данные Hadoop
(1907) - Блокчейн
(1673) - С#
(141) - С++
(271) - Консультирование по вопросам карьеры
(1060) - Облачные вычисления
(3469) - Кибербезопасность и этичный взлом
(162) - Аналитика данных
(1266) - База данных
(855) - Наука о данных
(76) - DevOps и Agile
(3608) - Цифровой маркетинг
(111) - События и актуальные темы
(28) - IoT (Интернет вещей)
(387) - Джава
(1247) - Котлин
(8) - Администрирование Linux
(389) - Машинное обучение
(337) - Микростратегия
(6) - PMP
(423) - Power BI
(516) - Питон
(3193) - РПА
(650) - SalesForce
(92) - Селен
(1569) - Тестирование программного обеспечения
(56) - Таблица
(608) - Таленд
(73) - ТипСкрипт
(124) - Веб-разработка
(3002) - Спросите нас о чем угодно!
(66) - Другие
(2231) - Мобильная разработка
(395) - Пользовательский интерфейс UX-дизайн
(24)
Подпишитесь на нашу рассылку и получайте персональные рекомендации.
Уже есть учетная запись? .
json-php на косой черте автор: Джордж Джемпти | Во всяком случае, в моем журнале: «JSON: клиент не может использовать Javascript» http://slashdot.org/~scriptify/journal/103074 |
JSON и циклические структуры данных… Автор: Люк Матушевски | Добро пожаловать Насчет циклических структур данных — с этим кто-нибудь сталкивался. Javascript |
проблемы с анализом JSON автор: paulfe4 | у меня есть запрос ajax, где сервер возвращает: {«PageDef»: { у меня есть следующая обработка кода. Javascript |
XML, JSON или что? автор: Фрэнк Миллман | Всем привет Я пишу многопользовательское бухгалтерское/бизнес-приложение, которое использует Python |
немного более мощный JSON автор: Ред Дэйли | Привет группа, Я использую JSON некоторое время, и это сделало многое проще простого. Javascript |
Синтаксис JSON с сервера? автор: pbd22 | Может кто-нибудь показать мне, что такое хорошо сформированный Я вижу кучу материалов в сети о парсинге JSON один раз. Visual Basic .NET |
Текущее предложение JSON в ES4 автор: dhtmlkitchen | JSON В ECMAScript 4 есть предложение JSON: Object.prototype.toJSONString Текущее предложение, String.prototype.parseJSON, возвращает… Javascript |
Re: Преобразование XML<-> JSON. Что вы думаете? автор: Лассе Райхштайн Нильсен | Макс Javascript |
Разбор данных JSON в сервлете автор: gjain123 | Всем привет, Я передаю данные json в сервлет, как показано ниже: |
Анализ строки JSON с помощью Perl, когда имя элемента неизвестно автор: liadmz | Привет, Я хотел бы проанализировать строку JSON с помощью perl. обычно я бы использовал: мой @elem= @{$decoded->{‘элементы’} };… |
привет автор: WisdomUfot | У вас есть интересный вопрос о том, как Gmail скрывает реферер HTTP при нажатии на ссылку в электронном письме. Хотя у меня нет конкретных технических деталей, Gmail, вероятно, реализует меры… Общие |
Скрыть метки в зависимости от значения флажка автор: ezappsrUS | Привет, Microsoft Access/VBA |
Суммирование только 7 старших чисел в таблице автор: CD Том | У меня есть таблица, которая может содержать до 12 записей для человека в поле номера, каждый номер может быть другим номером, я хочу только добавить 7 лучших номеров для каждого человека. Что такое… Общий |
Лучший справочник? автор: ADezii | Что является лучшим всеобъемлющим справочником по программированию приложений Windows в VB.NET. У меня есть опыт программирования в целом, но не VB.NET. Заранее спасибо. Visual Basic .NET |
UK Access User Group Meeting автор: isladogs | Меня попросили опубликовать информацию о следующем собрании группы пользователей доступа в Великобритании, которое состоится в четверг, 22 июня, с 16:00 до 17:30 по британскому времени (UTC+1). |