Yesod 包含Entity
数据类型,即具有来自数据库的 id 的模型。Yesod 还创建Entity
了 AesonToJSON
类的实例,因此可以轻松地将其序列化为 json。更棒的是,Entity
它可以被包裹在任何结构中,并且它也会被序列化。ToJSON
支持协议的类型很多。它非常方便,我非常喜欢它。
不幸的是,Yesod 提供的序列化格式Entity
不符合我的需求,我正在寻找一种简单而透明的方式来改变它。
这是一个例子。我有简单的模型
data Company = Company
{ companyName :: Text
}
相应的实体将是
Entity CompanyId Company
现在,从数据库中获取实体并将其返回为 json 的代码看起来像
getCompanyR = do
-- fetch companies from database
-- `companies` contains list of `Entity CompanyId Company`
companies <- runDB $ selectList ([] :: [Filter Company]) []
-- return it as json
-- List is also an instance of `ToJSON` so it could be serialized too
return . toJSON $ companies
序列化列表看起来像
[{"key":"o52553881f14995dade000000","value":{"name":"Pizza World"}}]
我希望它是
[{"id":"o52553881f14995dade000000","name":"Pizza World"}]
我可以看到几个关于如何更改它的选项,每个选项都有其缺点:
根据我的格式做一个序列化的函数
Entity
,但是之后就无法序列化List
ies了Entity
。我将结束编写多个函数以Entity
在它恰好属于的任何结构中进行序列化。为 an 创建一个新类型
Entity
,但是我应该在序列化之前将所有Entity
ies 转换为ies。MyNewEntity
这对我来说似乎很难看,它会导致不必要的转换噪音。
总而言之,我的问题是我无法更改Entity
ToJSON
实现,也无法让 Yesod 返回不同于Entity
. 我被迫进行转换,但最透明的方法是什么?