私は初めての 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
たが、実際にはこれを理解できません。