我正在处理我的第一个Haskell网络应用,并且无法将BSON文档转换为JSON,然后将其作为API响应发送。我目前正在使用AesonBson
软件包将我的BSON转换为Aeson Object
,但无法弄清楚如何将该Aeson Object
作为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]
,然后在尝试将它们作为JSON服务器响应返回之前,将aesonfy
映射到我的文档列表上。 / p>
问题是我一直收到此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
会返回一个Object
......不应该是ToJSON
的实例吗?任何帮助都将非常感激,我已经在这一个旋转我的车轮一段时间了。我尝试将Aeson的object
功能放在不同的地方,手动添加文档作为ToJSON
的实例,但实际上无法解决这个问题。
答案 0 :(得分:3)
您有两个不同版本的aeson
包:aeson-0.8.0.2
和aeson-0.6.2.1
。很明显,Value
中的aeson-0.6.2.1
不是来自FromJSON
的{{1}}的实例。
我建议你将代码和/或使用cabal沙箱联系起来。或者,您可以使用aeson-0.8.0.2
取消注册ghc-pkg
个版本之一。
ADD:您似乎与aeson
存在同样的问题。 GHC永远不会在错误消息中使用包名称和版本限定标识符,除非它不明确。试试transformers-0.3.0.0