【问题标题】:Gson POJO mapping loses custom field valueGson POJO 映射丢失自定义字段值
【发布时间】:2013-10-04 18:37:02
【问题描述】:

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

【问题讨论】:

    标签: java json jackson gson


    【解决方案1】:

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

    据我所知,Gson 中没有实现调用 setter/getter 的可能性。 Gson 这样做的原因更好地解释了here。 Jackson 和 Gson 的功能比较可以参考here,你可能对 setter/getter 部分感兴趣。

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

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

    【讨论】:

    • 感谢您的信息。检查 null 的问题是实际模型包含诸如 long 之类的原语。
    • 我明白了。但是如果你使用 Java > 1.5 你可以使用 Long 而不是 long 并检查 Long 字段是否由 Gson 填充。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2016-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多