Я написал потоковый синтаксический анализатор JSON pcrov / JsonReader для PHP 7 с API на основе XMLReader .
Он значительно отличается от событийногосинтаксические анализаторы в этом, вместо того, чтобы устанавливать обратные вызовы и позволять анализатору делать свое дело, вы вызываете методы анализатора для перемещения вперед или извлечения данных по желанию.Нашли нужные вам биты и хотите прекратить разбор?Затем прекратите синтаксический анализ (и вызовите close()
, потому что это хорошо.)
(Для более длинного обзора парсеров, основанных на событиях по сравнению с событиями, см. Модели чтения XML: SAX противXML pull parser .)
Пример 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, зависит от его структуры и того, что вы хотите с ним делать.Эти примеры должны дать вам место для начала.