2016-08-16 109 views
3

我想序列化和反序列化不同类型的地图。我想序列化/反序列化与杰克逊不同类型的地图

Map<String, MyInterface> map1; 

被序列化和反序列化不同于

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>> { 
    ... 
} 

我然后将它们添加到我的Module并指定类型:

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()); 

的问题是,这种类型的地图有时传递给MyFirstSerializer或地图类型有时传递给MySecondSerializer

我认为问题是地图的类型在运行时被擦除,并且没有办法区分这两个不同的地图。我如何解决这个问题?我看过Serialize/Deserialize Map<String, Object> with Jackson但找不到解决方案。

+0

也许定义,使他们没有得到消除,你自己喜欢的类型'公共类MyInterfaceMap扩展地图<字符串,MyInterface的> {... }'然后根据你的类型创建你的(de)序列化器public class MyFirstSerializer extends JsonSerializer {...}',可能会工作。 – walen

+0

@walen这是我也到达的解决方案。如果没有其他解决方案,我会最终做到这一点,所以随时添加一个答案 – Ian2thedv

回答

3

我认为你可以使用jackson.core.type.TypeReference对于这样的工作:

TypeReference能够存储泛型类型变量在运行时允许杰克逊推断值类型和正确的反序列化W/O任何需要在自定义(de)序列化器。

另一种方法是使用JSON desrialize明确定义com.fasterxml.jackson.databind.type.CollectionType

CollectionType collectionType = 
    objectMapper.getTypeFactory() 
     .constructMapType(Map.class, String.class, Property.class); 
List<Map<String, Property>> objects = 
    mapper.readValue(jsonString, collectionType);