Jackson使用MapSerializer序列化Map类型,并使用StdKeySerializer序列化键.它被实现为
@Override
public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
if (value instanceof Date) {
provider.defaultSerializeDateKey((Date) value, jgen);
} else {
jgen.writeFieldName(value.toString());
}
}
您可以看到只获取对象的toString()值.因此,您可以覆盖枚举中的toString()方法
public String toString() {
return getValue();
}
@JsonValue变得无用.
或者,如果您需要toString()保持相同(或默认),您可以创建一个包装Map的自定义类型
class CustomType {
private Map map;
@JsonAnyGetter // necessary to unwrap the Map to the root object, see here: http://jira.codehaus.org/browse/JACKSON-765
@JsonSerialize(keyUsing = ClusterTypeKeySerializer.class)
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
}
并使用自定义JsonSerializer
class ClusterTypeKeySerializer extends StdSerializer {
protected ClusterTypeKeySerializer() {
super(ClusterType.class);
}
@Override
public void serialize(ClusterType value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonGenerationException {
jgen.writeFieldName(value.getValue());
}
}
使用ClusterType#getValue()方法.同样,我们不使用@JsonValue.