2011-07-19 65 views
4

使用Grail 1.3.7我发现JSON转换器忽略了Domain对象的瞬态属性。 问题:有没有一种优雅的方法来解决这个障碍。Grails JSON转换器和瞬态属性

奖金问题:排除计算字段(瞬态道具)被发送到响应的原因是什么?

回答

4

一种方法是手动创建您的json响应,例如,

["prop1" : obj.prop1, "prop2" : obj.prop2, ...] as JSON 
+1

好吧我想......但如果我有20个字段运行? – dbrin

+0

您可以通过调用domainClass.properties来获取所有属性,然后对这些属性进行交互并生成json响应。有许多财产访问方法。看看:http://grails.org/doc/latest/api/org/codehaus/groovy/grails/commons/DefaultGrailsDomainClass.html – hitty5

+0

我试过了,但我没有看到一种方法来限制到的子集属性给我关心的一次......我必须俯视一些东西。但我同意你的观点,这可能是自定义JSON响应而不创建自定义编组器的最佳方式。 – dbrin

5

瞬态正好由为:Variables may be marked transient to indicate that they are not part of the persistent state of an object

和JSON是对象

所以,如果你需要它来进行序列化的序列化(=持续的)状态 - 你必须创建一个新的类,只是为了json序列化,这将有你需要序列化的所有字段。

+5

+1正确回答奖金Q.但是我觉得有一个合法的用例来标记一个字段的瞬态,但也让JSON转换器来捡起它 - 一个配置标志将在这里创造奇迹:) – dbrin

0

如果你需要排除的JSON,我细使用JSONBuilder比转换器一个更好的选择,所包含的字段/细粒度控制。这里的an example如何做到这一点。

4

什么对我的作品是这一行

def jsonobj=domobj.properties as JSON 
+0

不错,我应该下次试试。 – dbrin

0

您可以使用“marshallers”插件,并定义瞬态特性虚拟这样的:

static marshalling = { 
     virtual { 
     yourPropery { value, json -> json.value(value.yourPropery) } 
     } 
    }