java - Gson Instance Creator 创建了实例,但字段为空

标签 java json rest gson

我有这个 JSON 字符串..

{"id":0,"entryDate":1497716236038,"guestName":"a","bookingRooms":[{"id":0,"bookingId":0,"roomId":2,"startDate":0,"endDate":0}]}

这是Gson的解析结果..

Booking [id=0, entryDate=Sat Jun 17 21:47:16 IST 2017, 
 guestName=a, bookingRooms=[
  BookingRoom [id=null, bookingId=null, roomId=null, startDate=null, endDate=null]
 ]
]

如您所见, BookingRoom 的所有字段实例结果是null 。但是,输入的字段至少为零。

在我的类型结构中,List<IBookingRooms>Booking类是一个接口(interface)。我注册了InstanceCreator与 Gson 一起,这样我就可以创建 BookingRoom 的新实例类。

我的理解是,一旦我从 InstanceCreator Hook 中给 Gson 空白实例,它应该能够设置 Json 字符串中的字段。然而,这并没有发生。

我错过了什么吗?您能建议如何解决这个问题吗?

第二个问题是,即使输入 JSON 字符串中的 bookingRooms 为空数组,解析后的列表仍然具有相同的一项,且所有字段均为空!

JSON 字符串..

{"id":0,"entryDate":1497716236038,"guestName":"a","bookingRooms":[]}

List 中仍然有一个空实例!

Booking [id=0, entryDate=Sat Jun 17 21:47:16 IST 2017, 
 guestName=a, bookingRooms=[
  BookingRoom [id=null, bookingId=null, roomId=null, startDate=null, endDate=null]
 ]
]

最佳答案

InstanceCreator 类似乎只能解决“实例创建”问题,即构造函数问题。当该类是具体类,但该具体类没有无参数构造函数时,这适用。

对于接口(interface)来说,还存在另一个问题。 Gson 依靠成员变量来确定要序列化和反序列化的字段列表。对于接口(interface),Gson 得出结论,有 0 个字段需要反序列化。

因此,一旦实例创建者创建了具体实例,Gson 仍然不会复制任何字段。这是因为它通过接口(interface)反射构建了字段列表。

解决方案是使用 JsonDeserializer

关于java - Gson Instance Creator 创建了实例,但字段为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44606967/

相关文章:

php - 使用带有 key 的 REST_Controller Codeigniter API

java - 我可以创建在 JBOSS 服务器上运行的类的对象吗?

java - Image.setIcon(Parameters) 不刷新标签

java - 谷歌地图与我的应用程序

javascript - 如何编写此正则表达式以获取多行数据并转换为 JSON 数组

objective-c - 无法从服务中读取 JSON

javascript - 用于 JSON 缩小的 UglifyJs JavaScript API?

javascript - AngularJS:忽略 Content-Type 参数

java - AutoCloseable的close方法抛异常有意义吗?这应该如何处理?

java - Java 和 Python 之间的 XML 序列化库互操作性