在控制器中将 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 sessionFactorySessionFactory 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 PropertyDescriptors that have no getter, but the loop in GroovyBeanMarshaller 中的循环排除了 getMetaClassgetClass getters.