Инкрементальный разбор JSON в php - PullRequest
16 голосов
/ 05 сентября 2011

В php-программе я хочу постепенно анализировать JSON. Например, учитывая частичный JSON

[1, 2, {"id": 3},

Я хочу получить 1, 2 и словарь еще до того, как остальная часть ввода JSON будет транслироваться. json_decode от php просто возвращает NULL, и, похоже, нет способа определить позицию ошибки.

Ответы [ 3 ]

6 голосов
/ 27 октября 2011

Обновление

Я написал небольшой класс, который выполняет разбор символов в формате JSON. https://github.com/janeklb/JSONCharInputReader

Свежий пресс, так что, вероятно, есть несколько ошибок ... если вы решите попробовать, дайте мне знать!

-

Не могли бы вы (при отслеживании объема '{', '[', ']', '}') разбить поток на каждую запятую, не являющуюся частью строкового значения? А затем обработать каждый токен с помощью json_decode ()?

Это решение будет работать лучше всего, если в потоке json не будет много больших объектов (так как они будут проанализированы только после того, как они будут доставлены полностью).

Редактировать: если бы у него были большие объекты, эту стратегию можно было бы изменить, чтобы она выглядела немного "глубже" ... но сложность здесь возрастет.

3 голосов
/ 22 марта 2013

Я написал SAX-подобный потоковый анализатор JSON , который должен помочь. Дайте мне знать, если это работает!

1 голос
/ 05 сентября 2011

Существует простой обходной путь, если каждый отдельный элемент гарантированно будет получен полностью или, другими словами, вы не можете получить, например, только половина объекта, подобного этому:

{"a": 1,

json_decode() вернет NULL, поскольку передаваемая строка не является допустимой строкой JSON. Замените завершающую запятую конечной скобкой, и вот вам:

[1, 2, {"id": 3}]

Нет проблем с декодированием сейчас и ожиданием получения других частей потока позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...