【问题标题】:Jackson: how can I ignore getter but parse setter? [duplicate]杰克逊:我怎么能忽略getter但解析setter? [复制]
【发布时间】:2020-11-03 21:21:56
【问题描述】:

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

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

但是 setter 上的 @JsonIgnore(false) 似乎不起作用。

我希望:

s1=test1
s2=test2

但是得到了:

s1=null
s2=test2

如何让s1 字段上的设置器工作?

【问题讨论】:

  • 从setter方法中移除@JsonIgnore(false),你不需要它
  • @Deadpool ,但我需要用字段“s1”反序列化这个bean(即我需要杰克逊反序列化字段“s1”和“s2”)。无法删除 @JsonIgnore(false)
  • 应该可以的,你试过了吗?以及任何错误信息?
  • @Deadpool ,我尝试使用com.fasterxml.jackson.core:jackson-databind:2.10.0,总是得到s1=null \n s2=test2(我期望s1=test1 \n s2=test2)。您是否尝试过,您使用的是什么 Jackson 版本?

标签: java json jackson


【解决方案1】:

您可以将@JsonPropertyJsonProperty.Access.WRITE_ONLY 一起使用

from docs

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

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

【讨论】:

    猜你喜欢
    • 2014-06-04
    • 2019-02-06
    • 2016-09-11
    • 2017-02-15
    • 1970-01-01
    • 2016-04-19
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多