7

为生成的类型编写 ToJSON/FromJSON 实例并不难但是,当你生成代码时,你能把它扔进去吗?或者作为 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

4 回答 4

10

对于没有注意到 Michael Snowman 帖子的子评论的任何人,在持久性的最新版本中,您可以执行以下操作:

Person json
    name Text
    age Int

并获取 Person 的 ToJSON 和 FromJSON 实例。

于 2013-12-08T12:44:11.267 回答
6

我实际上认为我们会将此功能添加到 Persistent 0.8(将在一两周内与 Yesod 0.10 一起发布)。dflemstr 所说的依赖膨胀是真的,这就是为什么我们过去没有这样做的原因,但是我们现在已经依赖 aeson 作为我们的配置类型(基于 Yaml 配置文件,它使用 aeson 的数据类型)。

于 2012-02-02T06:05:41.887 回答
2

您可以只使用Data.Aeson.TH.

{-# LANGUAGE TemplateHaskell #-}
$(deriveJSON id ''Foo)

这应该适用于 Yesod 生成的数据类型以及您自己的类型。

它需要一个函数来自定义记录字段名称。在这里,我刚刚通过id让它们保持不变。有关详细信息,请参阅文档

于 2012-02-02T01:44:45.287 回答
1

默认的 Yesod 类型生成器不应该生成ToJSON/实例,因为即使您不想使用该包,这FromJSON也会添加依赖,这可能会导致依赖膨胀。aeson

您可以导入Data.Aeson.TH并使用此代码自动创建 JSON 实例:

data MyDataType = ...

deriveJSON id ''MyDataType

id如果您不希望 Haskell 中的字段名称与 JSON 文件中的字段名称相同,请替换为为您重命名字段的函数。

于 2012-02-02T01:44:18.560 回答