Jackson 如何保存 Map 中 key 的类型信息
資深大佬 : JasonLaw 9
首先看以下代码了解问题。
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 的类型信息吗?如果可以,应该怎么做呢?
我所做的尝试:
- 我尝试过配置 SerializationFeature,但是没有一个相关的 SerializationFeature 是可以实现这个功能的。
- 我发现
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(),因此没有保存类型信息。
大佬有話說 (7)