1

我正在开发我的第一个 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,但实在想不通。

4

1 回答 1

3

您有两个不同版本的aeson包:aeson-0.8.0.2aeson-0.6.2.1. 显然Valuefromaeson-0.6.2.1不是 from 的一个FromJSON实例aeson-0.8.0.2

我建议您对代码进行 cabalize 和/或使用 cabal 沙箱。或者,您可以使用ghc-pkg注销其中一个aeson版本。

添加:您似乎对transformers-0.3.0.0. GHC 永远不会在错误消息中使用包名称和版本来限定标识符,除非它是模棱两可的。尝试ghc-pkg list transformers

于 2015-06-06T19:32:40.060 回答