在控制器中将 POJO 转换为 json
Convert POJO to json in a conroller
我已经通过
将 POGO 转换为 json
class Test {
String test
}
def local = new Test()
local.test = "1234"
render test as JSON
然而,当尝试转换 java class(在不同的库中声明)时,我总是返回 class 类型
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"
}
我是不是漏掉了什么?
将对象转换为 JSON 是基于属性。 Groovy class 中的 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,因此如果您在获取 and/or 设置时需要自定义逻辑,可以自由自定义其中一个或两者。如果您显式地使字段 public (public String test
) 或使用任何其他范围修饰符,则不会发生此转换。
这就是域 class 的工作方式; Hibernate 没有对 Groovy 的任何支持,但它不需要任何支持 - 它会看到 getters 和 setters,就像您创建了一个典型的冗长 POJO 一样。这也是 Spring bean 依赖注入的工作方式;如果您在 controller/service/taglib/etc 中有一个字段。像 def sessionFactory
或 SessionFactory sessionFactory
,Groovy 添加了 getter 和 setter,而 Spring 看到了 setter,因为 Grails 使用自动装配按名称,如果有一个名为 "sessionFactory" 的 bean,Spring 将调用你的 setter 并注入它。
您的 Java class 没有 属性 - 它有一个 public 字段,并且 Java 编译器不执行任何操作它很特别,Groovy 和 Grails 都不会用它做任何事情,因为它是 Java class。因此,通过 getter 从 class 获得的唯一数据是 class,因为每个 class 都有一个 getClass
方法。
JSON 转换排除了 Groovy class 中的 class
"property" 而不是 Java 但这似乎是一个错误; GenericJavaBeanMarshaller (the helper class for POJOs) only excludes PropertyDescriptor
s that have no getter, but the loop in GroovyBeanMarshaller 中的循环排除了 getMetaClass
和 getClass
getters.
我已经通过
将 POGO 转换为 jsonclass Test {
String test
}
def local = new Test()
local.test = "1234"
render test as JSON
然而,当尝试转换 java class(在不同的库中声明)时,我总是返回 class 类型
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"
}
我是不是漏掉了什么?
将对象转换为 JSON 是基于属性。 Groovy class 中的 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,因此如果您在获取 and/or 设置时需要自定义逻辑,可以自由自定义其中一个或两者。如果您显式地使字段 public (public String test
) 或使用任何其他范围修饰符,则不会发生此转换。
这就是域 class 的工作方式; Hibernate 没有对 Groovy 的任何支持,但它不需要任何支持 - 它会看到 getters 和 setters,就像您创建了一个典型的冗长 POJO 一样。这也是 Spring bean 依赖注入的工作方式;如果您在 controller/service/taglib/etc 中有一个字段。像 def sessionFactory
或 SessionFactory sessionFactory
,Groovy 添加了 getter 和 setter,而 Spring 看到了 setter,因为 Grails 使用自动装配按名称,如果有一个名为 "sessionFactory" 的 bean,Spring 将调用你的 setter 并注入它。
您的 Java class 没有 属性 - 它有一个 public 字段,并且 Java 编译器不执行任何操作它很特别,Groovy 和 Grails 都不会用它做任何事情,因为它是 Java class。因此,通过 getter 从 class 获得的唯一数据是 class,因为每个 class 都有一个 getClass
方法。
JSON 转换排除了 Groovy class 中的 class
"property" 而不是 Java 但这似乎是一个错误; GenericJavaBeanMarshaller (the helper class for POJOs) only excludes PropertyDescriptor
s that have no getter, but the loop in GroovyBeanMarshaller 中的循环排除了 getMetaClass
和 getClass
getters.