【发布时间】:2013-11-17 23:40:06
【问题描述】:
我正在使用 Jackson 进行 JSON 序列化,并编写了几个自定义的 String 序列化器,一个用于类的每个 getter 方法。每个方法都返回相同的类型Set<String>,但每个方法都使用不同的序列化程序。
不幸的是,Jackson 并没有使用每个序列化器,每个方法使用一个序列化器,而是为两个序列化器使用一个序列化器。它似乎采用任何方法首先按字母顺序排列,并将其序列化程序用于两种方法。我期望的是第一种方法上注解的序列化器用于第一种方法,第二种方法上注解的序列化器用于第二种方法。调试似乎表明 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> - 序列化有效。
提前致谢。
【问题讨论】:
-
我们能知道您使用的 Jackson 版本吗?
-
我已经用 Jackson(org.codehaus.jackson) 1.9.11 检查了这种行为,但它不起作用。之后,我将 Jackson 库更新到 2.2.2 版(com.fasterxml.jackson),效果非常好。你能在你的项目中升级 Jackson 库吗?
-
我不认为我可以,因为另一个使用 Jackson
-
我最终升级到 Jackson 2.x,一切都很好。谢谢。