我正在尝试使用Gson将JSON映射到POJO,其中POJO包含不属于JSON的自定义字段。调用其他字段的setter时,该字段会更新,以将要更新的字段的名称添加到列表中。
POJO类看起来像这样:
public class myPojo {
private List<String> dirtyFields;
private String id;
private String subject;
private String title;
public myPojo() {
dirtyFields = new ArrayList<String>();
}
public getId() {
return id;
}
public setId(String id) {
this.id = id;
}
public getSubject() {
return subject;
}
public setSubject(String subject) {
this.subject = subject;
dirtyFields.add("subject");
}
// more setter/getters
}
dirtyFields
ivar不是反序列化字段,但用于跟踪正在更新的字段。
但是,映射后,列表似乎变成了一个空列表。杰克逊的情况并非如此。
这是由于预期的Gson行为吗?
答案 0 :(得分:0)
Gson在反序列化/序列化期间不调用setter / getter。相反,它使用反射直接访问字段(即使私有/受保护)。这就解释了为什么dirtyFields
ivar是空的。
据我所知,在Gson中没有实现调用setter / getters的可能性。 Gson之所以这样做是为了更好地解释here。可以找到Jackson和Gson特征之间的比较here,您可能对setter / getter部分感兴趣。
然而,Gson可以非常灵活地添加自定义行为以获得所需内容,您应该开始阅读Read and write Json properties using methods (ie. getters & setters) bug
另一种计算dirtyFields
列表的方法可能是使用反射并检查POJO的每个字段是否为空。您可以从this开始。