можно ли анализировать и использовать результаты парсера aeson из потока в постоянном пространстве?

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

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

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


person Jon Schoning    schedule 20.03.2015    source источник


Ответы (2)


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

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

person Michael Snoyman    schedule 20.03.2015
comment
Кажется, что json плохо подходит для постепенного синтаксического анализа, поскольку поля могут поступать в любом порядке. yajl выполняет синтаксический анализ постепенно, но он может быть не так полезен, если вы хотите выполнить синтаксический анализ в пользовательской структуре данных, потому что результат непригоден для использования до тех пор, пока не будет использован весь поток: синтаксические анализаторы SAX более или менее просто лексеры, предоставляющие вам последовательность токены, а не для десериализации xml в структуры (если только вы не можете ограничиться разбором только списка json на верхнем уровне). Вместо этого вам придется накапливать свой результат, обновляя его всякий раз, когда появляется поле, о котором вы заботитесь. - person Jon Schoning; 20.03.2015

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

person ondra    schedule 17.04.2015