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

24

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

如何强制Jackson仅序列化已注释的属性而不包括其他内容?


你可以很容易地通过使用@JsonIgnore来避免序列化带注释的属性。 - Mena
@Mena 这一点一点也不好 - 它强制我对基类进行注释。我不想这样做。 - Denis Kulagin
“它强制我也注释基类” --> 我看不出它会这样做。您可以注释要忽略的属性,然后完成,您的对象将序列化所有属性,除了那些被忽略的。 - Mena
可能是Jackson:仅序列化标记字段的重复问题。 - Chris Peacock
2个回答

31

如果禁用所有自动检测,它只会序列化您已经注释的属性--无论是属性本身还是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
运行得非常好,您是最棒的! - Denis Kulagin
仅需提及:它需要 com.fasterxml.jackson.core.jackson-databind Maven 构件。 - Denis Kulagin
感谢您提供这个回答。Jackson正按照我的要求进行序列化,而无需经过Mixin或CustomSerializer的处理。 - TemarV
2
从2.13版本开始,ObjectMapper::disable已被弃用。新的方法是使用JsonMapper.Builder::.featuresToDisable。我使用提供的Jackson2ObjectMapperBuilder作为方便。 - MrAaronOlsen

22

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接