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 }’

私が見逃しているものはありますか?aesonifyAeson を返すように見えますObject... のインスタンスではないToJSONでしょうか? どんな助けでも大歓迎です。私はしばらくの間、これで車輪を回転させてきました。Aeson のobject関数を別の場所に配置して、ドキュメントを のインスタンスとして手動で追加しようとしましToJSONたが、実際にはこれを理解できません。

4

1 に答える 1

3

aesonパッケージには と の 2 つの異なるバージョンがありaeson-0.8.0.2ますaeson-0.6.2.1。明らかにValuefromはfromaeson-0.6.2.1のインスタンスではありません。FromJSONaeson-0.8.0.2

コードをキャバリゼーションするか、cabal サンドボックスを使用することをお勧めします。ghc-pkgまたは、バージョンの 1 つを登録解除するために使用できaesonます。

追加: と同じ問題があるようtransformers-0.3.0.0です。GHC は、あいまいでない限り、エラー メッセージ内のパッケージ名とバージョンで識別子を修飾しません。試すghc-pkg list transformers

于 2015-06-06T19:32:40.060 に答える