如何使 Jackson 在序列化对象时忽略 get() 方法

2022-09-01 07:36:10

我在一个名为:Project

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

序列化项目对象时,将调用该方法,并向序列化对象添加一个字段。getAllReleases()allReleases

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

或者,我可以做:

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

但是解决方案看起来有点丑陋,我很确定杰克逊一定提供了一些更简单的机制。

我错过了什么吗?断续器


答案 1

如果使用批注标记 getter 方法,则不应对其进行序列化。下面是一个示例:@JsonIgnore

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"
}

答案 2

您需要实现一个不执行任何操作的 JSon 序列化程序,然后使用 @JSonSerialize(using = EmptySerializer.class) 进行设置。

单击折射以进一步举例。

参考:杰克逊:如何防止字段序列化