【问题标题】:How to make Jackson ignore a get() method when serializing an object序列化对象时如何让杰克逊忽略 get() 方法
【发布时间】:2014-06-22 00:31:58
【问题描述】:

我在一个名为 Project 的类中有这段代码:

@Transient
public List<Release> getAllReleases() {
    List<Release> releases = new ArrayList<Release>();
    ...
    return releases;
}

当一个项目对象被序列化时,getAllReleases() 方法被调用,一个allReleases 字段被添加到被序列化的对象中。

如果我在方法之前添加@JsonIgnore,我会得到相同的结果。所以我想知道如何实现一个getFoo() 在序列化对象时被杰克逊忽略的方法。

或者我可以这样做:

static public List<Release> getAllReleases(Project proj) {
    List<Release> releases = new ArrayList<Release>();
    ...
    return releases;
}

但解决方案看起来有点难看,而且我很确定 Jackson 提供了一些更简单的机制。

我错过了什么吗? TIA

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

    您需要实现一个什么都不做的 JSon 序列化器,然后使用 @JSonSerialize(using = EmptySerializer.class) 设置它。

    单击参考以获取更多示例。

    参考:Jackson: how to prevent field serialization

    【讨论】:

      【解决方案2】:

      如果你用@JsonIgnore 注释标记getter 方法,它不应该被序列化。这是一个例子:

      public class JacksonIgnore {
      
          public static class Release {
              public final String version;
      
              public Release(String version) {
                  this.version = version;
              }
          }
          public static class Project {
              public final String name;
      
              public Project(String name) {
                  this.name = name;
              }
      
              @JsonIgnore
              public List<Release> getAllReleases() {
                  return Arrays.asList(new Release("r1"), new Release("r2"));
              }
          }
      
          public static void main(String[] args) throws JsonProcessingException {
              ObjectMapper mapper = new ObjectMapper();
              System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(new Project("test")));
          }
      }
      

      输出:

      {
        "name" : "test"
      }
      

      【讨论】:

      • 在依赖关系中挣扎,看起来我的项目同时使用了 jackson1 (org.codehaus.jackson) 和 jackson2 (com.fasterxml.jackson),它们似乎有冲突。 REST 控制器显然使用 jackson1 并忽略模型中使用的注释。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-22
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      • 2018-12-12
      • 2019-05-21
      相关资源
      最近更新 更多