因此,我一直在尝试让Jackson对我拥有的一个对象进行序列化/反序列化,该对象本质上具有以下结构:
MyObject {
String a;
Map map;
}
在其中地图可以容纳嵌套地图或“原始”值(字符串,整数,长整数,双精度…)
显然,由于要正确反序列化类型信息是必需的,因此我不得不告诉Jackson这样做-我使用了默认类型:
return new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.enableDefaultTyping(ObjectMapper.DefaultTyping.JAVA_LANG_OBJECT, JsonTypeInfo.As.WRAPPER_ARRAY);
该对象最终完全按照我的意愿进行了序列化,仅在必要时添加类型信息:
{
"a" : "SomeString",
"map" : {
"String1" : "String1",
"Float1" : ["java.lang.Float", 1.0],
"Long1" : ["java.lang.Long", 1],
"Int1" : 1,
"Double1" : 1.0
}
}
但是,当我尝试用杰克逊反序列化此JSON时,它失败并显示以下错误:
java.lang.IllegalArgumentException: Can not deserialize instance of out of START_ARRAY token
at [Source: N/A; line: -1, column: -1] (through reference chain: ["name"])
at com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:2615)
at com.fasterxml.jackson.databind.ObjectMapper.convertValue(ObjectMapper.java:2542)
at com.rbsgbm.agile.mongo.dbobject.JacksonDBObjectConverter.fromDBObject(JacksonDBObjectConverter.java:39)
at com.rbsgbm.agile.mongo.DBCursorIterator.next(DBCursorIterator.java:32)
at com.rbsgbm.agile.repository.StorageBasedRepository$StorageBasedQuery$StorageBasedQueryIterator.next(StorageBasedRepository.java:258)
at com.rbsgbm.agile.repository.StorageBasedRepository$StorageBasedQuery$StorageBasedQueryIterator.next(StorageBasedRepository.java:242)
at com.rbs.agile.strategy.strategymanager.store.mongo.MongoStrategyStore.loadStrategies(MongoStrategyStore.java:81)
这可能表明它对地图中的值感到困惑,因为杰克逊认为不需要类型信息,因此没有将其包装在数组中.
有人可以建议正确的方法吗?