web-dev-qa-db-ja.com

オブジェクトをシリアル化するときにJacksonがget()メソッドを無視するようにする方法

Projectという名前のクラスにこのコードがあります:

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

プロジェクトオブジェクトがシリアル化されると、getAllReleases()メソッドが呼び出され、allReleasesフィールドがシリアル化されたオブジェクトに追加されます。

メソッドの前に_@JsonIgnore_を追加すると、同じ結果が得られます。したがって、オブジェクトをシリアル化するときにJacksonによって無視されるgetFoo()メソッドをどのように実装できますか。

または、私は次のことができます:

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

しかし、解決策は少しいように見え、ジャクソンが提供するいくつかのより単純なメカニズムが必要であると確信しています。

何か不足していますか? TIA

24
NoUserFound

@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"
}
38
Alexey Gavrilov