杰克逊:如何仅序列化带注释的属性

时间:2014-09-17 14:57:42

标签: java json serialization jackson datamapper

我想定义我的自定义序列化策略(包括哪些字段),同时使用Jackson。我知道,我可以用视图/过滤器来做,但它引入了非常糟糕的事情 - 使用字段名称的字符串表示,这会自动解决自动重构问题。

如何强制杰克逊仅序列化带注释的属性,仅此而已?

2 个答案:

答案 0 :(得分:18)

如果禁用所有自动检测,则只应序列化已注释的属性 - 无论是属性本身还是getter。这是一个简单的例子:

private ObjectMapper om;

@Before
public void setUp() throws Exception {
    om = new ObjectMapper();
    // disable auto detection
    om.disable(MapperFeature.AUTO_DETECT_CREATORS,
            MapperFeature.AUTO_DETECT_FIELDS,
            MapperFeature.AUTO_DETECT_GETTERS,
            MapperFeature.AUTO_DETECT_IS_GETTERS);
    // if you want to prevent an exception when classes have no annotated properties
    om.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
}

@Test
public void test() throws Exception {
    BlahClass blahClass = new BlahClass(5, "email", true);
    String s = om.writeValueAsString(blahClass);
    System.out.println(s);
}

public static class BlahClass {
    @JsonProperty("id")
    public Integer id;
    @JsonProperty("email")
    public String email;
    public boolean isThing;

    public BlahClass(Integer id, String email, boolean thing) {
        this.id = id;
        this.email = email;
        isThing = thing;
    }
}

答案 1 :(得分:9)

如果您想要在不为特定类型配置映射器的情况下执行此操作:

@JsonAutoDetect(
    fieldVisibility = Visibility.NONE,
    setterVisibility = Visibility.NONE,
    getterVisibility = Visibility.NONE,
    isGetterVisibility = Visibility.NONE,
    creatorVisibility = Visibility.NONE
)
public class BlahClass {
    @JsonProperty("id")
    private Integer id;
    @JsonProperty("email")
    private String email;
}