2015-03-20 6 views
0

Обратите внимание, что fromJson возвращает результата, который может быть ошибки Строка или успеха.Можно ли анализировать и анализировать результаты анализатора эзонов из потока в постоянном пространстве?

Если я использую fromJson на потоке (например, response от HTTP-потоков, используя выражение parseFromStream (fromJSON <$> json')) (link), делает соответствующий рисунок на результат заставить весь поток в буфер полностью во-первых, для того, чтобы в разборе для определения успеха или неудачи, независимо от того, является ли дальнейшее потребление ответа достаточно ленивым (т. е. анализ постоянного пространства + потребление не является возможно)? Или, может и разбор и результат будут потребляться лениво, т. Е. Постоянный анализ пространства + потребление есть возможно)? Документ sau «parseFromStream потребляет только столько вклада, сколько необходимо для удовлетворения Parser», но неясно, как «удовлетворение Parser» относится к сопоставлению с образцом для результата для получения успеха или ошибки.

(P.S. В качестве альтернативы, это не возможно, есть другой способ, который позволяет постоянно-пространство разбора ж/потреблению?)

ответ

2

К сожалению, нет никакого способа сделать это в целом. Подход, который я использовал при написании xml-conduit, заключался в том, чтобы синтаксический анализатор обрабатывал отдельные события , как «начало элемента» и «конец элемента». В прошлом я неоднократно рассматривал аналогичную библиотеку Haskell для данных JSON.

На самом деле есть что-то подобное в виде связки библиотеки C: yajl.

+1

Похоже, что json плохо разбирается в пошаговом режиме, так как поля могут поступать в любом порядке. yajl обрабатывает поэтапно, но это может быть не так полезно, если вы хотите проанализировать структуру пользовательских данных, потому что результат не используется до тех пор, пока весь поток не будет потреблен: SAX «парсеры» являются более или менее просто лексерами, что дает вам последовательность токенов, а не десериализацию xml для структур (если только вы не можете ограничиться только синтаксическим анализом «json list» на верхнем уровне). Вы должны были бы вместо этого «накапливать» свой результат, обновлять его всякий раз, когда поле, которое вы заботитесь о прибытии –

0

Я только что закончил синтаксический анализатор json, который выполняет инкрементный синтаксический анализ. Как результат, так и вход могут потребляться лениво, это постоянное пространство, насколько возможно постоянное пространство. Посмотрите, если это вам поможет: https://github.com/ondrap/json-stream