【问题标题】:httpSink and parsing jsonhttpSink 和解析 json
【发布时间】:2018-03-11 13:58:03
【问题描述】:

我认为这对我来说有点高级,但我的目标是从 http API 获取原始 json,从中解析第一个列表,做任何我需要做的事情,然后继续下一个列表, 等等。我希望这一次只允许将一个列表加载到内存中(每个列表都非常小,但 json 中有很多列表)。 我用 Aeson 试了一下,它吃掉了所有的 ram,没完没了地处理了好几个小时,最后我不得不杀死它。

如果我理解正确,httpSink 应该是要走的路,也许用 json-stream 来做实际的解析。我阅读了有关导管的教程,但我显然没有正确理解它,因为我无法做到这一点。

我知道如何使用 parseByteString 以我需要的方式解码 ByteString(至少我的测试似乎有效),但我想不出一种方法来使用 parseByteString 作为 httpSink 的第二个参数的接收器。 我是否遗漏了一些明显的东西,还是我误解了管道的工作方式?

谢谢

【问题讨论】:

  • 你的问题不是很清楚。
  • 正如我所说,我正在寻找一种方法来使用来自 json-stream 的 parseByteString 作为 httpSink 的接收器。

标签: haskell conduit jsonstream


【解决方案1】:

我还没有测试过这个,因为老实说我对这个库不太熟悉,但我认为这个适配器函数可以让它与管道一起工作:

module Data.JsonStream.Parser.Conduit
  ( jsonConduit
  , JsonStreamException (..)
  ) where

import Data.Conduit
import Data.JsonStream.Parser
import Data.ByteString (ByteString)
import Control.Monad.Catch
import Data.Typeable

jsonConduit
  :: MonadThrow m
  => Parser a
  -> ConduitM ByteString a m ()
jsonConduit =
    go . runParser
  where
    go (ParseYield x p) = yield x >> go p
    go (ParseNeedData f) = await >>= maybe
      (throwM JsonStreamNotEnoughData)
      (go . f)
    go (ParseFailed str) = throwM $ JsonStreamException str
    go (ParseDone bs) = leftover bs

data JsonStreamException
  = JsonStreamException !String
  | JsonStreamNotEnoughData
  deriving (Show, Typeable)
instance Exception JsonStreamException

【讨论】:

  • 好吧,我基本上不明白它是如何工作的,但确实如此!非常感谢。猜猜我有很多阅读要尝试弄清楚这到底是做什么的:)
【解决方案2】:

你写道:

我阅读了有关管道的教程,但我显然没有正确理解它,因为我无法做到这一点。

 

我想不出一种方法来使用 parseByteString 作为 httpSink 的第二个参数的接收器。

这里的问题是Sink 只是管道的简写:

type Sink i m r = ConduitM i Void m r

Sink 是一种没有下游组件的管道。

导管是您需要的解决方案,我假设this 是您阅读的教程。如果您对其中的某些概念不满意,请尝试询问有关它的具体问题。

【讨论】:

  • 我就是不明白。例如,如果 Sink 没有下游,httpSink 返回什么?好吧,我该如何使用它。浪费时间尝试了很多方法将 parseByteString 放在那里但没有成功,我只是不明白如何使用 httpSink 来打印正文,这是我找到的唯一示例。
  • 问题是 json-stream 没有对 Conduit 的内置支持。您需要通过直接处理 ParseOutput 类型来添加此类支持。但是用 Conduit 将这些东西连接起来并不是一个好的第一个活动。
猜你喜欢
  • 1970-01-01
  • 2016-11-04
  • 2017-05-31
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 2020-02-14
  • 2014-03-06
相关资源
最近更新 更多