Java 使用Jackson序列化/反序列化不同类型的映射

Java 使用Jackson序列化/反序列化不同类型的映射,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我试图以不同的方式序列化和反序列化不同类型的映射。我想要 Map<String, MyInterface> map1; 问题是,类型的映射有时会传递给MyFirstSerializer,或者类型的映射有时会传递给MySecondSerializer 我认为问题在于,地图的类型在运行时被擦除,并且无法区分这两种不同的地图。我该怎么做 我已经看过了,但找不到解决办法。我想你可以用这种工作: Map解析= objectMapper.readValue( jsonString, 新类型引用

我试图以不同的方式序列化和反序列化不同类型的映射。我想要

Map<String, MyInterface> map1;
问题是,类型的映射有时会传递给
MyFirstSerializer
,或者类型的映射有时会传递给
MySecondSerializer

我认为问题在于,地图的类型在运行时被擦除,并且无法区分这两种不同的地图。我该怎么做

我已经看过了,但找不到解决办法。

我想你可以用这种工作:

Map解析=
objectMapper.readValue(
jsonString,
新类型引用(){}
);
TypeReference
能够在运行时存储泛型类型参数,允许jackson推断值类型并正确反序列化它,而不需要自定义(反)序列化程序

另一种方法是使用显式定义的:

CollectionType CollectionType=
objectMapper.getTypeFactory()
.constructMapType(Map.class、String.class、Property.class);
列出对象=
readValue(jsonString,collectionType);

也许可以定义自己的类型,这样它们就不会被删除,比如
公共类MyInterfaceMap Extendes Map{…}
,然后基于您的类型创建(反)序列化程序
公共类MyFirstSerializer Extendes JsonSerializer{…}
,可能会起作用。@walen这是我也找到的解决方案。如果没有其他解决方案,我最终会这样做,所以请随意添加一个答案
Map<String, String> map2;
public class MyFirstSerializer extends JsonSerializer<Map<String, Property>> {
    ...
}
public class MySecondSerializer extends JsonSerializer<Map<String, String>> {
    ...
}
public class MyFirstDeserializer extends JsonDeserializer<Map<String, Property>> {
    ...
}
public class MySecondDeserializer extends JsonDeserializer<Map<String, String>> {
    ...
}
SimpleModule module = new SimpleModule("MyModule", new Version(1, 0, 0, "beta"));
module.addSerializer(new MyFirstSerializer());
module.addDeserializer((Class<Map<String, Property>>) (Class<?>) Map.class, new MyFirstDeserializer());

module.addSerializer(new MySecondSerializer());
module.addDeserializer((Class<Map<String, String>>) (Class<?>) Map.class, new MySecondDeserializer());
CollectionType collectionType =
    objectMapper.getTypeFactory()
        .constructMapType(Map.class, String.class, Property.class);
List<Map<String, Property>> objects = 
    mapper.readValue(jsonString, collectionType);