【发布时间】:2016-07-17 06:37:41
【问题描述】:
我既想使用自定义序列化程序,又想获得 JsonInclude.Include.NON_DEFAULT 称号。当我不使用自定义序列化程序时,它很荣幸,但当我使用自定义序列化程序时,它不是。
这是杰克逊 2.2.2。我目前无法切换到更新版本的 Jackson。
这是一个显示问题的简单示例:
import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import java.io.IOException;
import java.util.EnumSet;
import java.util.Set;
import java.util.stream.Collectors;
public class JacksonSerialization
{
public static void main(String[] args) throws Exception {
ObjectMapper serializer = new ObjectMapper();
Foo foo = new Foo();
foo.setFlags(EnumSet.of(Flag.CC, Flag.BB));
System.out.println(serializer.writeValueAsString(foo));
foo = new Foo();
System.out.println(serializer.writeValueAsString(foo));
}
public static enum Flag
{
AA,
BB,
CC
}
@JsonInclude(JsonInclude.Include.NON_DEFAULT)
public static class Foo
{
private Set<Flag> flags;
public Foo() {
flags = EnumSet.of(Flag.AA);
}
@JsonGetter("f")
@JsonSerialize(using = FlagSetSerializer.class)
public Set<Flag> getFlags() {
return flags;
}
public void setFlags(Set<Flag> theFlags) {
flags = theFlags;
}
}
public static class FlagSetSerializer extends JsonSerializer<Set<Flag>>
{
@Override
public void serialize(Set<Flag> value,
JsonGenerator jsonGenerator,
SerializerProvider serializerProvider) throws IOException {
String csv = value.stream()
.map(Flag::toString)
.collect(Collectors.joining(","));
jsonGenerator.writeString(csv);
}
}
}
这是输出:
{"f":"BB,CC"}
{"f":"AA"}
请注意,f 正在被序列化,即使它具有默认值。如果我注释掉 @JsonSerialize 注释,那么我会得到以下输出:
{"f":["BB","CC"]}
{}
然后f 正确地不 被序列化。但当然,事情并没有以我想要的格式序列化。
那么我如何让自定义序列化程序遵守类的 @JsonInclude 注释?
【问题讨论】:
标签: java json serialization jackson jsonserializer