所以我一直试图让杰克逊序列化/反序列化我拥有的一个对象,这个对象实际上是结构:
MyObject {
String a;
Map<String, Object> map;
}
其中map可以包含嵌套地图或“原始”值(String, Integer, Long, Double...)
显然,由于类型信息需要正确反序列化,我必须告诉杰克逊这样做 - 我已经使用了默认输入:
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
}
}
但是,当我尝试使用Jackson反序列化此JSON时,它会因以下错误而失败:
java.lang.IllegalArgumentException: Can not deserialize instance of <my type> out of START_ARRAY token
at [Source: N/A; line: -1, column: -1] (through reference chain: <my type>["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)
这表明它对地图中的值感到困惑,杰克逊认为没有必要提供类型信息,因此没有将它包装成数组。
有人可以建议正确的方法吗?
答案 0 :(得分:4)
嗨,请男士请这样做以解决您的问题
首先使用适当的getter和setter方法创建一个MyObject类。
/**
*
* @author qualebs
*/
public class MyObject {
private String a;
private Map<String, Object> map;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}
然后在您要序列化MyObject的类中使用以下配置创建ObjectMapper的实例
ObjectMapper mapper = new ObjectMapper().configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
// get an create a new MyObject
MyObject object = new MyObject();
// set the values you want ie the String a and the Map
Map<String, Object> map = new HashMap<String, Object>();
map.put("string", "example string");
map.put("int", 1);
map.put("long", 1l);
map.put("double", 2.0);
// we can also put an array
map.put("intArray", new int[]{1, 2, 3, 10});
// add the map to your object
object.setMap(map);
// set the string a
object.setA("example String 2");
// now we serialize the object
String mySerializedObj = mapper.writeValueAsString(object);
// to deserialize simply do
MyObject myUnserializedObj = mapper.readValue(mySerializedObj, MyObject.class);
如果这回答你的问题,请接受我的回答我可以使用积分。谢谢。