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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值