Поиск чрезвычайно большого файла JSON в PHP [duplicate]

SELECT * FROM t1 ORDER BY rev DESC LIMIT 1;
19
задан The Mighty Rubber Duck 29 October 2010 в 07:10
поделиться

5 ответов

Я решил работать над парсером, основанным на событиях.

EDIT:

Я, наконец, разработал версию синтаксического анализатора, которая Я доволен. Он доступен на GitHub:

https://github.com/kuma-giyomu/JSONParser

Там, вероятно, есть место для некоторого улучшения и приветствуются отзывы.

14
ответ дан The Mighty Rubber Duck 5 September 2018 в 11:44
поделиться

Это простой потоковый анализатор для обработки больших документов JSON. Используйте его для синтаксического анализа очень больших документов JSON, чтобы не загружать всю вещь в память, а именно, как работает любой другой парсер JSON для PHP.

https://github.com/salsify/ jsonstreamingparser

2
ответ дан Aaron Averill 5 September 2018 в 11:44
поделиться

Существует http://github.com/sfalvo/php-yajl/ Я не использовал его сам.

0
ответ дан Alexandre Jasmin 5 September 2018 в 11:44
поделиться

Существует нечто подобное, но только для C ++ и Java . Если вы не можете получить доступ к одной из этих библиотек с PHP, для PHP в этом нет реализации, но json_read(), насколько мне известно. Однако, если json структурирован так просто, легко просто прочитать файл до следующего }, а затем обработать JSON, полученный через json_read(). Но вам лучше сделать это буферизированное, например, чтение 10kb, split by}, если не найдено, прочитайте еще 10k, а затем обработайте найденные значения. Затем прочитайте следующий блок и т. Д.

2
ответ дан joni 5 September 2018 в 11:44
поделиться

Я написал потоковый JSON pull parser pcrov / JsonReader для PHP 7 с api на основе XMLReader .

Он значительно отличается от основанные на событиях, в том, что вместо того, чтобы настраивать обратные вызовы и позволяя синтаксическому анализатору выполнять свою задачу, вы вызываете методы в синтаксическом анализаторе для перемещения или получения данных по желанию. Нашли нужный бит и хотите прекратить разбор? Затем прекратите синтаксический анализ (и назовите close(), потому что это хорошая вещь.)

(Немного более длинный обзор синтаксических разрывов на основе событий см. В моделях XML-читателей: SAX (g2).


Пример 1:

Прочитайте каждый объект целиком из вашего JSON.

use pcrov\JsonReader\JsonReader;

$reader = new JsonReader();
$reader->open("data.json");

$reader->read(); // Outer array.
$depth = $reader->depth(); // Check in a moment to break when the array is done.
$reader->read(); // Step to the first object.
do {
    print_r($reader->value()); // Do your thing.
} while ($reader->next() && $reader->depth() > $depth); // Read each sibling.

$reader->close();

Вывод:

Array
(
    [property] => value
    [property2] => value2
)
Array
(
    [prop] => val
)
Array
(
    [foo] => bar
)

Объекты возвращаются в виде массивов с строгими ключами, из-за (частично) к крайним случаям, когда действительный JSON будет выдавать имена свойств, которые недопустимы в объектах PHP. Работа над этими конфликтами не стоит, так как анонимный объект stdClass не имеет значения в простейшем массиве.


Пример 2:

Прочитайте каждый именованный элемент отдельно.

$reader = new pcrov\JsonReader\JsonReader();
$reader->open("data.json");

while ($reader->read()) {
    $name = $reader->name();
    if ($name !== null) {
        echo "$name: {$reader->value()}\n";
    }
}

$reader->close();

Выход:

property: value
property2: value2
prop: val
foo: bar

Пример 3:

Прочитайте каждое свойство заданного имени. Бонус: чтение из строки вместо URI, а также получение данных из свойств с дублирующимися именами в одном и том же объекте (что разрешено в JSON, как весело.)

$json = <<<'JSON'
[
    {"property":"value", "property2":"value2"},
    {"foo":"foo", "foo":"bar"},
    {"prop":"val"},
    {"foo":"baz"},
    {"foo":"quux"}
]
JSON;

$reader = new pcrov\JsonReader\JsonReader();
$reader->json($json);

while ($reader->read("foo")) {
    echo "{$reader->name()}: {$reader->value()}\n";
}

$reader->close();

Выход:

foo: foo
foo: bar
foo: baz
foo: quux

Как точно лучше всего читать ваш JSON зависит от его структуры и того, что вы хотите с ней делать. Эти примеры должны дать вам возможность начать.

14
ответ дан Paul Crovella 5 September 2018 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: