为什么Yesod中没有ToJSON / FromJSON的持久类型实例?

时间:2012-02-02 01:29:16

标签: haskell yesod aeson

或者有一种简单的方法可以让这种情况成为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所产生的足够的咒语。

4 个答案:

答案 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替换为为您重命名字段的函数。