在控制器中将POJO转换为json

时间:2015-01-04 20:35:17

标签: grails

我设法通过

将POGO转换为json
class 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"
}

我错过了什么吗?

1 个答案:

答案 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 sessionFactorySessionFactory 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中的循环排除了getMetaClassgetClass吸气剂。