Yesod包含Entity
數據類型,即模型及其來自數據庫的ID。 Yesod也讓Entity
成爲Aeson的ToJSON
類的一個實例,所以它可以很容易地序列化爲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
的Entity
。我將結束編寫多個函數來將它碰巧屬於的任何結構序列化爲Entity
。爲
Entity
創建一種新類型,但在序列化之前,我應該將所有Entity
轉換爲MyNewEntity
。這對我來說很醜陋,會導致不必要的轉換噪音。
總之,我的問題是,我不能改變Entity
ToJSON
實現了,我不能讓耶索德返回的東西比Entity
不同。我不得不進行轉換,但什麼是最透明的方式呢?
如果您需要多種表示形式,這絕對是一種方法。這不完全是我的問題,因爲我只需要一個自定義表示。我已經想出了一個更簡單的解決方案,但你的更一般。謝謝。 – lambdas