2016-08-16 2 views
3

Я пытаюсь сериализовать и десериализовать различные типы карт по-разному. Я хочуСериализовать/Deserialize карты с различными типами с Jackson

Map<String, MyInterface> map1; 

сериализовать и десериализации иначе, чем

Map<String, String> map2; 

Я создал два сериализаторы

public class MyFirstSerializer extends JsonSerializer<Map<String, Property>> { 
    ... 
} 

и

public class MySecondSerializer extends JsonSerializer<Map<String, String>> { 
    ... 
} 

и два deserializers

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 расширяет Map {... } ', а затем создание сериализаторов (de) на основе ваших типов' public class MyFirstSerializer расширяет JsonSerializer {...} ', может работать. – walen

+0

@walen это решение, к которому я тоже пришел. Если нет других решений, я закончу это, поэтому не стесняйтесь добавлять ответ – Ian2thedv

ответ

3

Я думаю, что вы можете использовать jackson.core.type.TypeReference для такого рода работы:

TypeReference способен хранить общий аргумент типа во время выполнения, что позволяет Джексону вывести тип значения и десериализации правильно без какой-либо необходимости в пользовательские (де) сериализаторы.

Другой способ desrialize JSON с использованием явно определено 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); 
Смежные вопросы