杰克逊基于场的序列化

时间:2012-04-20 04:42:21

标签: java json jackson

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

例如:

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”。无论如何我可以覆盖这个只获得“我”? 如果有一种方法可以在不向类添加任何注释的情况下执行此操作(它们是自动生成的),那就太棒了。

4 个答案:

答案 0 :(得分:11)

查看@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
}

答案 1 :(得分:6)

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

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

答案 2 :(得分:5)

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

ObjectMapper om = new ObjectMapper();
om.setVisibilityChecker(om.getSerializationConfig().getDefaultVisibilityChecker().
            withGetterVisibility(JsonAutoDetect.Visibility.NONE).
            withSetterVisibility(JsonAutoDetect.Visibility.NONE));

答案 3 :(得分:3)

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

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

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