У меня есть класс, который выглядит следующим образом
public class MyClass {
private String val1;
private String val2;
private Map<String,Object> context;
// Appropriate accessors removed for brevity.
...
}
Я ищу, чтобы иметь возможность совершить кругосветное путешествие с Джексоном с объекта на JSON и обратно. Я могу сериализовать объект выше штрафа и получить следующий вывод:
{
"val1": "foo",
"val2": "bar",
"context": {
"key1": "enumValue1",
"key2": "stringValue1",
"key3": 3.0
}
}
Проблема, с которой я сталкиваюсь, заключается в том, что, поскольку значения в сериализованной карте не имеют никакой информации о типе, они не десериализованы правильно. Например, в примере выше enumValue1 следует десериализовать как значение перечисления, но вместо этого десериализуется как строка. Я видел примеры для того, чтобы основывать какой тип на разных вещах, но в моем сценарии я не буду знать, какие типы (они будут объектами, создаваемыми пользователем, которые я не буду знать заранее), поэтому мне нужно быть способный сериализовать информацию о типе с помощью пары значений ключа. Как я могу выполнить это с Джексоном?
Для записи я использую версию Jackson 2.4.2. Код, который я использую для проверки поездки туда и обратно, выглядит следующим образом:
@Test
@SuppressWarnings("unchecked")
public void testJsonSerialization() throws Exception {
// Get test object to serialize
T serializationValue = getSerializationValue();
// Serialize test object
String json = mapper.writeValueAsString(serializationValue);
// Test that object was serialized as expected
assertJson(json);
// Deserialize to complete round trip
T roundTrip = (T) mapper.readValue(json, serializationValue.getClass());
// Validate that the deserialized object matches the original one
assertObject(roundTrip);
}
Поскольку это проект на основе Spring, создатель создается следующим образом:
@Configuration
public static class SerializationConfiguration {
@Bean
public ObjectMapper mapper() {
Map<Class<?>, Class<?>> mixins = new HashMap<Class<?>, Class<?>>();
// Add unrelated MixIns
..
return new Jackson2ObjectMapperBuilder()
.featuresToDisable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)
.dateFormat(new ISO8601DateFormatWithMilliSeconds())
.mixIns(mixins)
.build();
}
}