Jackson 处理 Map key 为对象的情况

当使用 jackson 序列化 Map< ObjectA, ObjectB> 对象时,ObjectA 默认会以 toString 的方式来序列化,而在反序列化时,则会直接失败。这个问题,该如何解决呢?

jackson 提供额外的接口供我们扩展,网上以 2.x 版本为例的解决方案很多,1.x 的比较少,这里主要说 1.x 版本的解决方案。

在 jackson 里提供了 JsonSerializer 和 KeyDeserializer 抽象类,针对需要特殊处理的对象 ObjectA,提供对应的实现类,并调用 objectMapper.registerModule 方法注册进去即可。完整示例代码如下所示:

public class JsonUtil {
    private final static ObjectMapper objectMapper = new ObjectMapper();
    private final static JsonFactory jsonFactory = objectMapper.getJsonFactory();

    static {
        objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        // 将特殊的序列化和反序列化类添加到 objectMapper
        SimpleModule simpleModule = new SimpleModule("SimpleObject", Version.unknownVersion());
        simpleModule.addKeySerializer(SimpleObject.class, new SimpleObjectKeySerializer());
        simpleModule.addKeyDeserializer(SimpleObject.class, new SimpleObjectKeyDeSerializer());
        objectMapper.registerModule(simpleModule);
    }

    public static class SimpleObjectKeySerializer extends JsonSerializer<SimpleObject> {
        @Override
        public void serialize(SimpleObject SimpleObject, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            StringWriter writer = new StringWriter();
            objectMapper.writeValue(writer, SimpleObject);
            jsonGenerator.writeFieldName(writer.toString());
        }
    }

    public static class SimpleObjectKeyDeSerializer extends KeyDeserializer {
        @Override
        public SimpleObject deserializeKey(String key, DeserializationContext deserializationContext) throws IOException {
            return objectMapper.readValue(key, SimpleObject.class);
        }
    }

    public static class SimpleObject {
        private String key;
        public String getKey() {
            return key;
        }
        public void setKey(String key) {
            this.key = key;
        }
    }
}

jackson 2.x 版本的解决方案看此处:https://www.baeldung.com/jackson-map

发布了232 篇原创文章 · 获赞 347 · 访问量 79万+

猜你喜欢

转载自blog.csdn.net/hustspy1990/article/details/81668401
今日推荐