首先看以下代码了解问题。
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder().build();
ObjectMapper objectMapper = JsonMapper.builder()
.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.EVERYTHING)
.build();
// content 为`["Gender","FEMALE"]`,保存了类型信息
String content = objectMapper.writeValueAsString(Gender.FEMALE);
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder().build();
ObjectMapper objectMapper = JsonMapper.builder()
.activateDefaultTyping(ptv, ObjectMapper.DefaultTyping.EVERYTHING)
.build();
Map<Gender, String> map = new HashMap<>();
map.put(Gender.FEMALE, "v1");
// content 为`["java.util.HashMap",{"FEMALE":"v1"}]`,并没有保存 Map 中 key 的类型信息
String content = objectMapper.writeValueAsString(map);
我的问题:Jackson 可以做到保存 Map 中 key 的类型信息吗?如果可以,应该怎么做呢?
我所做的尝试:
objectMapper.writeValueAsString(Gender.FEMALE)
使用的是TypeWrappedSerializer
,最后调用StdScalarSerializer.serializeWithType(T value, JsonGenerator g, SerializerProvider provider, TypeSerializer typeSer)
,因此保存了类型信息。但是objectMapper.writeValueAsString(map)
不一样,在序列化 Map 中 key 的时候,最后会调用EnumKeySerializer.serialize(Object value, JsonGenerator g, SerializerProvider serializers)
,只是简单地调用了toString()
,因此没有保存类型信息。这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.