Инкрементный анализ JSON в php
В php-программе я хочу постепенно анализировать JSON. Например, с учетом частичного JSON
[1, 2, {"id": 3},
Я хочу получить 1, 2 и словарь даже до того, как остальная часть входа JSON будет передана. php json_decode
просто возвращает NULL
, и, похоже, нет способа получить позицию ошибки.
Ответы
Ответ 1
Обновление
Я написал небольшой класс, который выполняет char -by- char парсинг ввода JSON.
https://github.com/janeklb/JSONCharInputReader
Свежий от прессов, поэтому, вероятно, появилось несколько ошибок. Если вы решите попробовать, дайте мне знать!
-
Не могли бы вы (при отслеживании '{', '[', ']', '}' scope) разбить поток на каждую запятую, не являющуюся частью строкового значения?
А затем обрабатывать каждый токен с помощью json_decode()?
Это решение будет работать лучше всего, если в потоке json не было много больших объектов (поскольку они будут обрабатываться только после их полного заполнения).
Изменить: если у него большие объекты, эта стратегия может быть изменена, чтобы выглядеть немного "глубже", но сложность здесь будет стрелять.
Ответ 2
Я написал SAX-подобный потоковый парсер JSON, который должен сделать трюк. Дайте мне знать, если это сработает!
Ответ 3
Там есть простой обход, если каждый отдельный элемент гарантированно будет принят в нем целиком или другими словами - вы не можете получить, например. просто половина объекта вроде этого:
{"a": 1,
json_decode()
вернет NULL, потому что строка, которую вы передаете, не является допустимой строкой JSON. Замените конечную запятую конечной скобкой и там вы:
[1, 2, {"id": 3}]
Нет проблем в его расшифровке и ждать, пока другие части потока будут получены позже.