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

时间:2017-06-17 16:40:41

标签: 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是一个接口。我在Gson上注册了一个InstanceCreator,以便我可以创建BookingRoom类的新实例。

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

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

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

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]
 ]
]

1 个答案:

答案 0 :(得分:1)

InstanceCreator类似乎只是“实例创建”问题的解决方案,即构造函数问题。当类是具体类时,这是适用的,但该具体类没有no-args构造函数。

在界面的情况下,还存在另一个问题。 Gson依靠成员变量来确定要序列化和反序列化的字段列表。在接口的情况下,Gson得出结论,有0个字段要反序列化。

因此,一旦实例创建者创建了一个具体的实例,Gson仍然不会复制任何字段。这是因为它通过界面上的反射构建了字段列表。

解决方案是使用JsonDeserializer