代码之家  ›  专栏  ›  技术社区  ›  Ulrar

httpSink和解析json

  •  1
  • Ulrar  · 技术社区  · 8 年前

    我认为这对我来说有点高级,但我的目标是从http API获取原始json,从中解析第一个列表,做我需要做的任何事情,然后转到下一个列表,等等。我希望每次只能在内存中加载一个列表(每个列表都很小,但json中有很多列表)。

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

    2 回复  |  直到 8 年前
        1
  •  2
  •   Michael Snoyman    8 年前

    我还没有测试过这个,因为我对这个库不是很熟悉,但我认为这个适配器函数可以使它与导管一起工作:

    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
  •  0
  •   John F. Miller    8 年前

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

    这里的问题是 Sink

    type Sink i m r = ConduitM i Void m r
    

    A. 是一种没有下游组件的导管。

    导管是您需要的解决方案,我假设 this

    推荐文章
    Ulrar  ·  httpSink和解析json
    8 年前
    ErikR  ·  拆分导管链
    13 年前