1

我正在尝试使用 Gson 将 JSON 映射到 POJO,其中 POJO 包含不属于 JSON 的自定义字段。当调用其他字段的设置器以将正在更新的字段的名称添加到列表中时,该字段将被更新。

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
}

ivar 不是反序列化字段,dirtyFields但它用于跟踪正在更新的字段。然而,映射后,列表似乎变成了一个空列表。杰克逊的情况并非如此。这是由于预期的 Gson 行为吗?

4

1 回答 1

0

Gson 在反序列化/序列化过程中不会调用 setter/getter。相反,它使用反射直接访问字段(即使是私有/受保护的)。这解释了为什么你的dirtyFieldsivar 是空的。

据我所知,Gson 中没有实现调用 setter/getter 的可能性。Gson 这样做的原因在这里得到了更好的解释。可以在这里找到 Jackson 和 Gson 功能之间的比较,您可能对 setter/getter 部分感兴趣。

但是 Gson 非常灵活地添加自定义行为来获得您需要的东西,您应该开始阅读Read and write Json properties using methods (ie. getters & setters) bug

另一种计算dirtyFields列表的方法是使用反射并检查 POJO 的每个字段是否为空。你可以从这个开始。

于 2013-10-04T21:09:59.333 回答