java – 同一返回类型的多个Jackson序列化程序
|
我正在使用Jackson进行
JSON序列化,并编写了一些自定义String序列化程序,一个用于类的每个getter方法.每个方法返回相同的类型,Set< String>,但每个都使用不同的序列化程序.
不幸的是,杰克逊没有使用每个序列化器,每个方法一个,但是两个都使用一个序列化器.它似乎采用按字母顺序排列的任何方法,并使用其序列化程序用于这两种方法.我期望的是第一种方法注释的序列化器用于第一种方法,第二种方法注释的序列化器用于第二种方法.调试似乎表明Jackson在地图中使用方法的返回类型键入了序列化程序(两者都相同). 一个例子: public class FooBar {
private Set<String> foos = new HashSet<String>();
private Set<String> bars = new HashSet<String>();
@JsonProperty("FooWrapper")
@JsonSerialize(contentUsing = FooSerializer.class)
public Set<String> getFoos() {
return foos;
}
@JsonProperty("BarWrapper")
@JsonSerialize(contentUsing = BarSerializer.class)
public Set<String> getBars() {
return bars;
}
}
有关如何使用FooSerializer获取getFoos()方法序列化以及使用BarSerializer序列化的getBars()方法的任何建议?在此示例中,将为两种方法调用BarSerializer. 注意,如果我将其中一个方法的签名更改为另一个集合类型,那么它们就不同了 – List< String>例如 – 序列化工作. 提前致谢. 解决方法
我认为当将ObjectMapper与@JsonSerialize(contentUsing = BarSerializer.class)结合使用时,您在1.9.xx版本中无法实现的目标.
Jackson确实缓存了序列化程序,并根据与序列化程序关联的JavaType(在本例中为Set< String>)来缓存它们.见 虽然BeanProperty传递给此方法,但它不会用作缓存键的一部分.您可以继承StdSerializerProvider并在缓存值序列化器时考虑BeanProperty参数,但这可能不是解决问题的最简单方法. 快速解决方法是使用@JsonSerialize(使用= FooCollectionSerializer.class)并自行处理序列化.通过执行此操作,序列化程序是用于序列化属性的BeanPropertyWriter的directly coupled.使用@JsonSerialize(contentUsing = BarSerializer.class)时,没有与BeanPropertyWriter耦合的序列化程序触发serializer lookup根据JavaType缓存序列化程序 public class FooBar {
private Set<String> foos = new HashSet<>();
private Set<String> bars = new HashSet<>();
@JsonProperty("FooWrapper")
@JsonSerialize(using = FooCollectionSerializer.class)
public Set<String> getFoos() {
return foos;
}
@JsonProperty("BarWrapper")
@JsonSerialize(using = BarCollectionSerializer.class)
public Set<String> getBars() {
return bars;
}
public static class FooCollectionSerializer extends JsonSerializer<Collection<String>> {
JsonSerializer<Collection<String>> serializer;
public FooCollectionSerializer() {
//let Jackson deal with serializing the collection and just specify how you want to serialize indivial items
this.serializer = new StringCollectionSerializer(null,new FooSerializer());
}
@Override
public void serialize(Collection<String> value,JsonGenerator jgen,SerializerProvider provider) throws IOException,JsonProcessingException {
serializer.serialize(value,jgen,provider);
}
}
public static class FooSerializer extends SerializerBase<String> {
public FooSerializer() {
super(String.class);
}
@Override
public void serialize(String value,SerializerProvider provider) throws IOException {
jgen.writeString(value);
}
}
public static class BarCollectionSerializer extends JsonSerializer<Collection<String>> {
@Override
public void serialize(Collection<String> values,JsonProcessingException {
//handle serializing the collection yourself
jgen.writeStartArray();
for (String value : values) {
jgen.writeString(value);
}
jgen.writeEndArray();
}
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
