Gson POJO映射丢失自定义字段值

时间:2013-10-04 18:37:03

标签: java json jackson gson

我正在尝试使用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行为吗?

1 个答案:

答案 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开始。