我正在使用 Spring Boot 和自动配置的 objectMapper。
假设我需要序列化和反序列化各种键可以为空的HashMap。 AFAIK 默认情况下不支持此功能。那么,如何做到最简洁呢? 重要的是 objectMapper 需要像对待其他类型一样继续工作。
我已经尝试过:
com.fasterxml.jackson.datatype.jsr310.ser.key.Jsr310NullKeySerializer
,但它被标记为已弃用)。objectMapper.getSerializerProvider().setNullKeySerializer(new JsonSerializer<>() {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeFieldName("null");
}
});
请注意,我需要使用 Spring Boot 中的自动配置对象映射器,并在需要时对其进行调整,因此我希望没有
new ObjectMapper()
或类似内容的答案。另外,我不能在特定字段上使用像@JsonSerialize
这样的注释,整个配置只需要在一个地方完成。
class NullSerializerTest {
// borrowed from https://github.com/pugwoo/woo-utils/blob/master/src/main/java/com/pugwoo/wooutils/json/NullKeySerializer.java
public class NullKeySerializer extends JsonSerializer<Object> {
@Override
public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused)
throws IOException, JsonProcessingException {
jsonGenerator.writeFieldName("");
}
}
@Test
void testMapSerializer() throws JsonProcessingException {
Map map = new HashMap<>();
map.put("k", "v1");
map.put(null, "v2");
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.getSerializerProvider().setNullKeySerializer(new NullKeySerializer());
System.out.println(objectMapper.writeValueAsString(map)); // writes: {"":"v2","k":"v1"}
}
}