如何使用 Jackson 轻松序列化和反序列化带有空键的映射

问题描述 投票:0回答:1

我正在使用 Spring Boot 和自动配置的 objectMapper。

假设我需要序列化和反序列化各种键可以为空的HashMap。 AFAIK 默认情况下不支持此功能。那么,如何做到最简洁呢? 重要的是 objectMapper 需要像对待其他类型一样继续工作。

我已经尝试过:

  1. 对于序列化,我添加了一个自定义 NullKeySerializer,它会在映射键为 null 的情况下写入“null”字符串(见下文)。它可以在序列化期间破坏其他 java 类型(不是映射)吗?另外,也许某个地方存在捆绑的序列化器? (我只找到了
    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");
            }
        });
  1. 对于反序列化,我唯一发现的就是使用自定义反序列化器注册模块。 看起来您需要在这种情况下指定返回类型,所以我不确定在通用地图的情况下如何执行此操作(可以是 Map 或 Map - 在任何情况下,需要转换“null”字符串到“真实”零)。再说一遍,也许有一个现有的解串器可以实现这一点?

请注意,我需要使用 Spring Boot 中的自动配置对象映射器,并在需要时对其进行调整,因此我希望没有

new ObjectMapper()
或类似内容的答案。另外,我不能在特定字段上使用像
@JsonSerialize
这样的注释,整个配置只需要在一个地方完成。

java spring spring-boot jackson
1个回答
0
投票
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"}
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.