我正在开发我的第一个 Haskell Web 应用程序,并且无法将 BSON 文档转换为 JSON,然后将其作为 API 响应发送。我目前正在使用该AesonBson
包将我的 BSON 转换为 Aeson Object
,但无法弄清楚如何将该 AesonObject
作为 JSON API 响应发送。
这是我的服务器中路由处理程序的示例:
{-# LANGUAGE OverloadedStrings #-}
module Web.Routes where
import Web.Scotty
import Web.Utils
import Web.Actions.Database
import Control.Monad.Trans (liftIO)
import Data.AesonBson
routes :: ScottyM ()
routes = do
get "/databases/:db/:collection" $ do
db <- param "db"
collection <- param "collection"
docs <- liftIO $ getAllDocuments "127.0.0.1" db collection
json $ map aesonify docs
这些看起来应该很简单 -getAllDocuments
返回IO [Document]
,然后我映射aesonfy
到我的文档列表,然后尝试将它们作为 JSON 服务器响应返回。
问题是我不断收到此No instance for ToJSON
错误:
No instance for (aeson-0.8.0.2:Data.Aeson.Types.Class.ToJSON
aeson-0.6.2.1:Data.Aeson.Types.Internal.Value)
arising from a use of ‘Web.Scotty.json’
In the expression: Web.Scotty.json
In a stmt of a 'do' block:
Web.Scotty.json
GHC.Base.$ GHC.Base.map Data.AesonBson.aesonify docs
In the second argument of ‘(GHC.Base.$)’, namely
‘do { db <- Web.Scotty.param "db";
collection <- Web.Scotty.param "collection";
docs <- transformers-0.3.0.0:Control.Monad.IO.Class.liftIO
GHC.Base.$
Web.Actions.Database.getAllDocuments "127.0.0.1" db collection;
Web.Scotty.json
GHC.Base.$ GHC.Base.map Data.AesonBson.aesonify docs }’
知道我缺少什么吗?看起来aesonify
返回一个 Aeson Object
......那不应该是一个实例ToJSON
吗?任何帮助将不胜感激,我已经在这个上旋转了一段时间了。我试过将 Aeson 的object
功能放在不同的地方,手动添加文档作为 的实例ToJSON
,但实在想不通。