Jackson:反序列化为 Map<String、Object>每个值的类型正确
我有一个如下所示的类
public class MyClass {
private String val1;
private String val2;
private Map<String,Object> context;
// Appropriate accessors removed for brevity.
...
}
我希望能够与Jackson进行从对象到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();
}
}