gpt4 book ai didi

exception - 与 aeson/attoparsec 进行管道,一旦源没有更多数据,如何无异常地干净退出

转载 作者:行者123 更新时间:2023-12-01 01:05:05 25 4
gpt4 key购买 nike

我正在使用 aeson/attoparsecconduit/conduit-httpconduit-attoparsec 连接从文件/网络服务器解析 JSON 数据。我的问题是我的管道总是抛出这个异常......

ParseError {errorContexts = ["demandInput"], errorMessage = "not enough bytes", errorPosition = 1:1}

...一旦套接字关闭或我们点击 EOF。通过管道等解析和传递结果数据结构工作正常,但它总是以 sinkParser 结束。抛出这个异常。我是这样调用的...
j <- CA.sinkParser json

...在我的管道内,将 ByteStrings 解析为我的消息结构。

一旦没有更多数据(没有更多顶级表达式),我怎么能让它干净地退出管道?有没有什么体面的方法来检测/区分这个异常而不必查看错误字符串?

谢谢!

编辑: 示例:
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Control.Applicative
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as B8
import qualified Data.Conduit.Attoparsec as CA
import Data.Aeson
import Data.Conduit
import Data.Conduit.Binary
import Control.Monad.IO.Class

data MyMessage = MyMessage String deriving (Show)

parseMessage :: (MonadIO m, MonadResource m) => Conduit B.ByteString m B.ByteString
parseMessage = do
j <- CA.sinkParser json
let msg = fromJSON j :: Result MyMessage
yield $ case msg of
Success r -> B8.pack $ show r
Error s -> error s
parseMessage

main :: IO ()
main =
runResourceT $ do
sourceFile "./input.json" $$ parseMessage =$ sinkFile "./out.txt"

instance FromJSON MyMessage where
parseJSON j =
case j of
(Object o) -> MyMessage <$> o .: "text"
_ -> fail $ "Expected Object - " ++ show j

示例输入(input.json):
{"text":"abc"}
{"text":"123"}

输出:
out: ParseError {errorContexts = ["demandInput"], errorMessage = "not enough bytes", errorPosition = 3:1}

和out.txt:
MyMessage "abc"MyMessage "123"

最佳答案

这是 conduitParserEither 的完美用例:

parseMessage :: (MonadIO m, MonadResource m) => Conduit B.ByteString m B.ByteString
parseMessage =
CA.conduitParserEither json =$= awaitForever go
where
go (Left s) = error $ show s
go (Right (_, msg)) = yield $ B8.pack $ show msg ++ "\n"

如果您在 FP Haskell 中心,您可以 clone my solution into the IDE .

关于exception - 与 aeson/attoparsec 进行管道,一旦源没有更多数据,如何无异常地干净退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19511678/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com