2016-08-16 112 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);