7

我认为杰克逊做了基于方法的序列化,有什么方法可以使它基于字段?

前任:

class Bean {
    Integer i;
    String s;

    public Integer getI() { return this.i; }
    public void setI(Integer i) { this.i = i; }
    public bool isSetI() { return this.i != null; }

    // same for s as well
}

输出 JSON 有“i”和“setI”。无论如何我可以覆盖它以获得仅“i”吗?如果有一种方法可以在不向类添加任何注释的情况下执行此操作(它们是自动生成的),那就太好了。

4

4 回答 4

12

查看 @JsonAutoDetect 注释。例子:

@JsonAutoDetect(fieldVisibility=Visibility.ANY, getterVisibility=Visibility.NONE, isGetterVisibility=Visibility.NONE, setterVisibility=Visibility.NONE)
public class Bean {
    Integer i;
    String s;

    Integer getI() { return this.i; }
    void setI(Integer i) { this.i = i; }
    bool isSetI() return { this.i == null; }

    // same for s as well
}
于 2013-01-06T16:05:20.577 回答
6

杰克逊也可以使用字段,是的;但默认情况下只发现公共字段。但是你可以@JsonProperty用来标记非公共字段。

需要注意的一点是,如果同时存在方法 (setX, getX) 和字段 (x),则方法将具有优先权。这通常不是问题,但如果是,您需要显式禁用不使用的方法,方法是@JsonIgnore向它们添加 enxt。

于 2012-04-20T21:17:21.007 回答
5

要在没有注释的情况下完成此操作,您可以ObjectMapper通过以下方式配置序列化/反序列化之前:

ObjectMapper om = new ObjectMapper();
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker().
            withGetterVisibility(JsonAutoDetect.Visibility.NONE).
            withSetterVisibility(JsonAutoDetect.Visibility.NONE));
于 2013-03-07T10:37:48.970 回答
3

接受的答案没有为我产生预期的结果。在不添加注释的情况下对我有用的是ObjectMapper按以下方式配置:

ObjectMapper om = new ObjectMapper()
        .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE)
        .setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);

这对我来说似乎更有意义,它使用字段而不是像标准 Java 序列化那样的 getters\setters。

于 2017-01-23T13:14:02.253 回答