首页 > 解决方案 > 杰克逊:我怎么能忽略getter但解析setter?

问题描述

我需要序列化一个没有给定字段的 bean,但反序列化具有该字段的 bean。我@JsonIgnore在 getter 和@JsonIgnore(false)setter 上使用:

public class TestJson {
    private String s1, s2;

    @JsonIgnore
    public String getS1() {
        return s1;
    }

    @JsonIgnore(false)
    public void setS1(String s1) {
        this.s1 = s1;
    }

    public String getS2() {
        return s2;
    }

    public void setS2(String s2) {
        this.s2 = s2;
    }

    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        TestJson bean = new TestJson();
        bean.setS1("test1");
        bean.setS2("test2");
        System.out.println(mapper.writeValueAsString(bean));

        String json = "{\"s1\":\"test1\",\"s2\":\"test2\"}";
        bean = mapper.readValue(json, TestJson.class);
        System.out.println("s1=" + bean.getS1());
        System.out.println("s2=" + bean.getS2());
    }
}

序列化运行良好并获得预期值{"s2":"test2"}

但是@JsonIgnore(false)在二传手上似乎不起作用。

我预计:

s1=test1
s2=test2

但得到:

s1=null
s2=test2

我怎样才能让二传手在现场s1工作?

标签: javajsonjackson

解决方案


你可以@JsonProperty使用JsonProperty.Access.WRITE_ONLY

来自文档

访问设置,表示该属性只能被写(set)用于反序列化,而不会被读(get)在序列化时,即该属性的值不包含在序列化中。

public class TestJson {

    @JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
    private String s1;
    private String s2;


    public String getS1() {
        return s1;
    }

    public void setS1(String s1) {
        this.s1 = s1;
    }

    public String getS2() {
        return s2;
    }

    public void setS2(String s2) {
        this.s2 = s2;
    }
}

这也应该有效

public class TestJson {
    private String s1;
    private String s2;


    @JsonIgnore
    public String getS1() {
        return s1;
    }

    @JsonProperty
    public void setS1(String s1) {
        this.s1 = s1;
    }

    public String getS2() {
        return s2;
    }

    public void setS2(String s2) {
        this.s2 = s2;
    }
}

推荐阅读