2012-02-02 98 views
6

这不是很难为生成的类型编写ToJSON/FromJSON实例,但仍然可以在生成代码时将它抛入?或者是否有一种简单的方法可以让Yesod用户成为这种用户? (我没有挖过深成TH是如何工作的?)为什么Yesod中的ToJSON/FromJSON的Persistent类型实例不是?

更新: OK,我喜欢这个建议,但是,说我的执着类型是用户。如果我使用

​​

它产生

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 `*' 

我可能还是得到了错误的类型,但我无法找到足够的什么持续产生,以获得正确的咒语。

+0

你想通了吗?在这里遇到完全相同的问题。 – 2013-09-03 01:45:00

+0

我现在还没有和Yesod一起工作过很长一段时间,但我确信我使用Michael Snoyman链接中提到的添加的“json”工作:https:// github。com/yesodweb/yesod/wiki/Persistent-entity-syntax#json-instances – svachalek 2013-09-03 05:55:08

+0

谢谢,它的工作原理:) – 2013-09-04 00:09:51

回答

5

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

+0

谢谢迈克尔,听起来不错。同时,如果有人知道deriveJSON调用的正确语法,那也是有帮助的! – svachalek 2012-02-02 19:15:59

+0

一年后,这仍然不工作... – 2013-04-25 23:15:17

+3

这已执行了一段时间,请参阅:https://github.com/yesodweb/yesod/wiki/Persistent-entity-syntax#json-instances – 2013-04-26 05:53:13

1

默认耶索德类型发电机不应该产生ToJSON/FromJSON情况下,因为这将增加对aeson的依赖,即使你不想使用这个包,这可能导致依赖性膨胀。

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

data MyDataType = ... 

deriveJSON id ''MyDataType 

与重命名字段你,如果你不想在Haskell相同的字段名称作为函数替换id JSON文件。

2

您可以使用Data.Aeson.TH中的自动导出机制。

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

这应该工作在两个耶索德生成的数据类型以及自己的类型的罚款。

它需要定制记录字段名称的功能。在这里,我刚刚通过了id以使它们保持不变。 See the documentation for details

+0

谢谢,看起来你们俩在同一时间有相同的答案。 Yesod类型是别名,但它会生成“不支持的类型”错误。我尝试使用$(deriveJSON ID'UserGeneric),其中我喜欢的类型是用户,并得到了这一点: 种类不匹配 UserGeneric的'第一个参数”应该有一种'(* - > *) - > * - > *', 但'backend [i5XB]'kind *' – svachalek 2012-02-02 02:19:16

8

对于任何人谁没有注意到在迈克尔·雪人的帖子在持续重发版本,你可以做子评论,:

Person json 
    name Text 
    age Int 

,并得到人的toJSON和FromJSON实例。

相关问题