将BSON转换为JSON并作为API响应发送Haskell

时间:2015-06-06 19:21:07

标签: json mongodb haskell bson scotty

我正在处理我的第一个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的实例,但实际上无法解决这个问题。

1 个答案:

答案 0 :(得分:3)

您有两个不同版本的aeson包:aeson-0.8.0.2aeson-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