Haskell Aeson-deriveJSON与语法分析器的结合

Haskell Aeson-deriveJSON与语法分析器的结合,haskell,conduit,aeson,Haskell,Conduit,Aeson,继续我对导管和aeson的探索,我将如何使用我自己的数据类型,而不是在这个(稍加修改的)代码片段中使用Value {-#语言重载字符串,TemplateHaskell} 导入Network.Wai(响应、响应、应用程序、请求主体) 导入Network.HTTP.Types(status200、status400) 导入Network.Wai.Handler.Warp(运行) 导入Data.Aeson.Parser(json) 导入Data.conductor.Attoparsec(sinkPar

继续我对导管和aeson的探索,我将如何使用我自己的数据类型,而不是在这个(稍加修改的)代码片段中使用
Value

{-#语言重载字符串,TemplateHaskell}
导入Network.Wai(响应、响应、应用程序、请求主体)
导入Network.HTTP.Types(status200、status400)
导入Network.Wai.Handler.Warp(运行)
导入Data.Aeson.Parser(json)
导入Data.conductor.Attoparsec(sinkParser)
导入控制.Monad.IO.Class(liftIO)
导入数据.Aeson(值(..),编码,对象,(.=)
导入控制.Exception(SomeException)
导入Data.ByteString(ByteString)
导入数据。管道(ResourceT,($$))
导入控制.Exception.Lifted(句柄)
将限定的Data.HashMap.Strict导入为M
导入Data.Aeson.TH(deriveJSON)
--我加了这个
数据JSONRequest=JSONRequest{
命令::ByteString,
params::M.HashMap ByteString ByteString
}
deriveJSON id''JSONRequest
--我补充的内容到此为止
main::IO()
main=运行3000应用程序
应用程序::应用程序
app req=handle invalidJson$do
值IO值
发送=返回
基本上,我想将
dispatch
的类型更改为JSONRequest->iojsonrequest。我如何告诉解析器使用我自己的fromJSON派生实例


我试着添加一个类型声明,祈祷json上的多态返回类型,但我意识到它严格地是为了值。

只要看看类型,你不就需要
fmap
你的
来自json
而不是来自
json
的结果吗?对于
调度
而言,我们只需要一个合适的签名:

-- import Data.Aeson
app :: Application
app req = handle invalidJson $ do
      result <- requestBody req $$ sinkParser (fmap fromJSON json)
      next_result <- liftIO $ dispatch result
      return $ responseLBS status200 [("Content-Type", "application/json")] 
             $ encode next_result   

dispatch :: Result JSONRequest -> IO JSONRequest
dispatch (Error str) = undefined
dispatch (Success jsonreq) = return jsonreq
--导入数据.Aeson
应用程序::应用程序
app req=handle invalidJson$do

结果成功和错误来自哪里?来自
数据.Aeson
;我刚刚把它添加到我的附加导入中。它们在
Data.Aeson.Types.Internal
中定义:
Data Result a=Error String | Success a
这是json
返回的结果。给定一个有效的JSON“值”,它会查看它是否是您的JSON类型,并返回您的Haskell值(如果有效)。
-- import Data.Aeson
app :: Application
app req = handle invalidJson $ do
      result <- requestBody req $$ sinkParser (fmap fromJSON json)
      next_result <- liftIO $ dispatch result
      return $ responseLBS status200 [("Content-Type", "application/json")] 
             $ encode next_result   

dispatch :: Result JSONRequest -> IO JSONRequest
dispatch (Error str) = undefined
dispatch (Success jsonreq) = return jsonreq
-- import Data.Aeson
-- import qualified Data.Attoparsec as Atto
toRequest ::    Value -> Result JSONRequest
toRequest = fromJSON   -- specialized now to your fromJSON

jsonRequestParser :: Atto.Parser (Result JSONRequest)
jsonRequestParser = fmap toRequest json 

app :: Application
app req = handle invalidJson $ do
      result <- requestBody req $$ sinkParser jsonRequestParser
      next_result <- liftIO $ dispatch result
      return $ responseLBS status200 [("Content-Type", "application/json")]
             $ encode next_result   

dispatch :: Result JSONRequest -> IO JSONRequest
dispatch (Error str) = undefined
dispatch (Success jsonreq) = return jsonreq