我设法通过
将POGO转换为jsonclass Test {
String test
}
def local = new Test()
local.test = "1234"
render test as JSON
然而,当尝试转换java类(在不同的库中声明)时,我总是回到类类型
public class RegistrationDetails {
/**
* The registration token used to identify the device from now on.
*/
public String registrationToken;
}
RegistrationDetails details = new RegistrationDetails()
details.registrationToken="123"
render details as JSON
而不是
{
"registrationToken":"123"
}
相反,我回来了
{
"class": "data.com.shared.RegistrationDetails"
}
我错过了什么吗?
答案 0 :(得分:3)
将对象转换为JSON基于属性。 Groovy类中的String test
定义了一个名为“test”的属性,因为它是一个没有范围修饰符的字段。它默认为public,Groovy编译器将String test
转换为私有字段以及getter和setter。如果您反编译Test
(例如使用jd-gui或其他反编译器),您会看到与此类似的内容(包含一堆与此无关的其他代码):
public class Test implements GroovyObject {
private String test;
...
public String getTest() {
return test;
}
public void setTest(String paramString) {
test = paramString;
}
}
它不会取代现有的getter或setter,因此如果在获取和/或设置时需要自定义逻辑,则可以自由定制其中一个或两个。如果您明确地将该字段设为公共(public String test
)或使用任何其他范围修饰符,则不会发生此转换。
这是域类的工作方式; Hibernate对Groovy没有任何支持,但它不需要任何支持 - 如果你创建了一个典型的详细POJO,它会看到getters和setter。这也是Spring bean依赖注入的工作方式;如果你在控制器/ service / taglib / etc中有一个字段。像def sessionFactory
或SessionFactory sessionFactory
一样,Groovy添加了一个getter和setter,Spring看到了setter,因为Grails使用名称自动装配,如果有一个名为“sessionFactory”的bean,Spring会调用你的setter并注入它。
你的Java类没有属性 - 它有一个公共字段,Java编译器没有做任何特殊的事情,Groovy和Grails也没有对它做任何事情,因为它是一个Java类。因此,通过getter从类中获得的唯一数据是类,因为每个类都有getClass
方法。
JSON转换在Groovy类中排除class
“属性”但不包括Java,但这似乎是一个错误; GenericJavaBeanMarshaller中的循环(POJO的辅助类)仅排除没有getter的PropertyDescriptor
,但GroovyBeanMarshaller中的循环排除了getMetaClass
和getClass
吸气剂。