我有这个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]
]
]
答案 0 :(得分:1)
InstanceCreator
类似乎只是“实例创建”问题的解决方案,即构造函数问题。当类是具体类时,这是适用的,但该具体类没有no-args构造函数。
在界面的情况下,还存在另一个问题。 Gson依靠成员变量来确定要序列化和反序列化的字段列表。在接口的情况下,Gson得出结论,有0个字段要反序列化。
因此,一旦实例创建者创建了一个具体的实例,Gson仍然不会复制任何字段。这是因为它通过界面上的反射构建了字段列表。
解决方案是使用JsonDeserializer
。