gpt4 book ai didi

grails - 在 Controller 中将 POJO 转换为 json

转载 作者:行者123 更新时间:2023-12-02 14:23:24 25 4
gpt4 key购买 nike

我已经设法通过以下方式将 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"
}

我错过了什么吗?

最佳答案

将对象转换为 JSON 是基于属性的。 String test在 Groovy 类中定义了一个名为“test”的属性,因为它是一个没有范围修饰符的字段。它默认为 public,Groovy 编译器转换 String test到一个私有(private)字段和一个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) ( public String test) 或使用任何其他范围修饰符,则不会发生此转换。

这就是域类的工作方式; Hibernate 没有任何对 Groovy 的支持,但它不需要任何支持 - 它可以像创建典型的详细 POJO 一样查看 getter 和 setter。这也是 Spring bean 依赖注入(inject)的工作方式;如果您在 Controller /服务/标签库/等中有一个字段。喜欢 def sessionFactorySessionFactory sessionFactory ,Groovy 添加了一个 getter 和 setter,Spring 看到了 setter,而且由于 Grails 使用名称 Autowiring ,如果有一个名为“sessionFactory”的 bean,Spring 将调用你的 setter 并注入(inject)它。

你的 Java 类没有属性——它有一个公共(public)字段,Java 编译器没有对它做任何特殊的事情,而且 Groovy 和 Grails 也没有对它做任何事情,因为它是一个 Java 类。因此,通过 getter 可以从类中获得的唯一数据是类,因为每个类都有一个 getClass方法。

JSON 转换不包括 class Groovy 类中的“属性”而不是 Java 中的“属性”,但这似乎是一个错误; GenericJavaBeanMarshaller 中的循环(POJO 的辅助类)仅排除 PropertyDescriptor s 没有 setter/getter ,但 GroovyBeanMarshaller 中的循环不包括 getMetaClassgetClass setter/getter 。

关于grails - 在 Controller 中将 POJO 转换为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27770085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com