Парсинг 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 — PHP

json-php на косой черте

автор: Джордж Джемпти |
последнее сообщение от:

Во всяком случае, в моем журнале:

«JSON: клиент не может использовать Javascript»

http://slashdot.org/~scriptify/journal/103074

JSON и циклические структуры данных…

Автор: Люк Матушевски |
последнее сообщение от:

Добро пожаловать
Как и предполагалось, я заглянул в проект JSON и был поражен, но…

Насчет циклических структур данных — с этим кто-нибудь сталкивался.
проект ?
Есть ли какие-либо удовлетворительные рекомендации …

Javascript

проблемы с анализом JSON

автор: paulfe4 |
последнее сообщение от:

у меня есть запрос ajax, где сервер возвращает:

{«PageDef»: {
«ИмяСтраницы»: «Мое Имя»,
«имя_запроса»: «имя_запроса»,
«queryCtName»: «myqueryctname»
}};

у меня есть следующая обработка кода. ..

Javascript

XML, JSON или что?

автор: Фрэнк Миллман |
последнее сообщение от:

Всем привет

Я пишу многопользовательское бухгалтерское/бизнес-приложение, которое использует
сокеты для связи между сервером и клиентом. Сервер содержит
вся бизнес-логика. Не имеет прямого…

Python

немного более мощный JSON

автор: Ред Дэйли |
последнее сообщение от:

Привет группа,

Я использую JSON некоторое время, и это сделало многое проще простого.
Однако JSON изначально не описывает некоторые вещи, такие как указатели.
и пользовательские типы. Я создал простой…

Javascript

Синтаксис JSON с сервера?

автор: pbd22 |
последнее сообщение от:

Может кто-нибудь показать мне, что такое хорошо сформированный
Строка JSON будет выглядеть до отправки обратно
клиенту?

Я вижу кучу материалов в сети о парсинге JSON один раз.
на клиенте и…

Visual Basic .NET

Текущее предложение JSON в ES4

автор: dhtmlkitchen |
последнее сообщение от:

JSON
Мы все знаем, что это такое.

В ECMAScript 4 есть предложение JSON:

Object.prototype.toJSONString
Строка.прототип.parseJSON

Текущее предложение, String.prototype.parseJSON, возвращает…

Javascript

Re: Преобразование XML<-> JSON. Что вы думаете?

автор: Лассе Райхштайн Нильсен |
последнее сообщение от:

Макс
некоторый

Javascript

Разбор данных JSON в сервлете

автор: gjain123 |
последнее сообщение от:

Всем привет,

Я передаю данные json в сервлет, как показано ниже:
Внеш. Ajax.request({
URL-адрес: CONTEXTPATH ​​+ «/ServletURL»,
тип: ‘пост’,
jsonData: {
запись: образец,
комментарии: текст

Анализ строки 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).

Imacros | Все права защищены © 2021