或者有一种简单的方法可以让这种情况成为Yesod用户吗? (我没有深入研究TH如何工作......)
更新 好的,我喜欢这个建议但是,说我的持久类型是用户。如果我使用
$(deriveJSON id ''User)
它产生
Exception when trying to run compile-time code:
Data.Aeson.TH.withType: Unsupported type: TySynD Model.User [] (AppT (ConT Model.UserGeneric) (ConT Database.Persist.GenericSql.Raw.SqlPersist))
Code: deriveJSON (id) 'User
显然是因为它是别名。但
$(deriveJSON id ''UserGeneric)
产量
Kind mis-match
The first argument of `UserGeneric' should have kind `(* -> *)
-> *
-> *',
but `backend[i5XB]' has kind `*'
我可能仍然输错了类型,但我找不到Persistent所产生的足够的咒语。
答案 0 :(得分:8)
对于那些没有注意到Michael Snowman的帖子的评论的人,在持久的版本中,你可以做到:
Person json
name Text
age Int
获取Person的ToJSON和FromJSON实例。
答案 1 :(得分:5)
我实际上认为我们会将此功能添加到Persistent 0.8(在一周或两周内与Yesod 0.10一起发布)。 dflemstr关于依赖膨胀的说法是正确的,这就是我们过去没有这样做的原因,但我们现在已经依赖于aeson我们的配置类型(基于Yaml配置文件,它使用了aeson的数据类型)。
答案 2 :(得分:2)
您可以使用Data.Aeson.TH
中的自动派生机制。
{-# LANGUAGE TemplateHaskell #-}
$(deriveJSON id ''Foo)
这应该可以在Yesod生成的数据类型以及您自己的类型上正常工作。
需要一个函数来自定义记录字段名称。在这里,我刚刚通过id
来改变它们。 See the documentation for details
答案 3 :(得分:1)
默认的Yesod类型生成器不应生成ToJSON
/ FromJSON
个实例,因为即使您不想使用该包,也会在aeson
上添加依赖关系可能导致依赖膨胀。
您可以导入Data.Aeson.TH
并使用此代码自动创建JSON实例:
data MyDataType = ...
deriveJSON id ''MyDataType
如果您不希望Haskell中的字段名称与JSON文件中的字段名称相同,请将id
替换为为您重命名字段的函数。