我正在尝试使用Jackson来反序列化对象上的一个属性,该属性是一个类型化对象列表。当我尝试这样做时,我遇到了以下错误:
“无法从JSON字符串实例化类型为[map type; class java.util.HashMap, [simple type, class java.lang.String] -> [simple type, class java.lang.String]]的值;没有单字符串构造函数/工厂方法”
到目前为止,我已经写了以下代码,但它似乎不起作用。
我的反序列化类如下所示。
我在使用简单的模块来添加反序列化器,如下所示。
我尝试反序列化的JSON字符串如下:
当进行反序列化时,似乎在我的对象中的第一个属性(一个列表)上出现问题,因为它抱怨的是一个字符串列表
“无法从JSON字符串实例化类型为[map type; class java.util.HashMap, [simple type, class java.lang.String] -> [simple type, class java.lang.String]]的值;没有单字符串构造函数/工厂方法”
到目前为止,我已经写了以下代码,但它似乎不起作用。
Terms.class
@JsonDeserialize(as=JsonMapDeserializer)
private List<ObjectA> results = null; //ommitted getter and setters
我的反序列化类如下所示。
public class JsonMapDeserializer extends JsonDeserializer<List<ObjectA>> {
List<ObjectA> retMap = new ArrayList<ObjectA>();
TypeReference<HashMap<String,String>[]> typeRef = new TypeReference<HashMap<String,String>[]>() {};
@Override
public List<ObjectA> deserialize(JsonParser parser, DeserializationContext ctx)
throws IOException, JsonProcessingException {
ObjectMapper mapper = new ObjectMapper();
//read the json string into the map
HashMap<String, String>[] maps = mapper.readValue(parser, typeRef);
if(maps != null) {
for(HashMap<String, String> map : maps) {
ObjectA result = new ObjectA("id", map.get("id"));
retMap.add(result);
}
}
return retMap;
}
}
我在使用简单的模块来添加反序列化器,如下所示。
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule("safety", Version.unknownVersion());
module.addDeserializer(List.class, new JsonMapDeserializer());
mapper.registerModule(module);
我尝试反序列化的JSON字符串如下:
"SearchTerms":{"results":[{id":"1010","checked":"true"}] // there are other fields I have just omitted them
当我运行反序列化代码时,我会得到以下的堆栈跟踪信息:
org.codehaus.jackson.map.JsonMappingException: Can not instantiate value of type [map type; class java.util.HashMap, [simple type, class java.lang.String] -> [simple type, class java.lang.String]] from JSON String; no single-String constructor/factory method (through reference chain: com.model.search["searchTerm1"])
at org.codehaus.jackson.map.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:379)
at org.codehaus.jackson.map.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:268)
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:244)
at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33)
at org.codehaus.jackson.map.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:104)
at org.codehaus.jackson.map.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:18)
at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:2695)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1294)
at com.az.rd.ke.json.JsonColumnMapDeserializer.deserialize(JsonColumnMapDeserializer.java:41)
at com.az.rd.ke.json.JsonColumnMapDeserializer.deserialize(JsonColumnMapDeserializer.java:27)
at org.codehaus.jackson.map.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:299)
at org.codehaus.jackson.map.deser.SettableBeanProperty$MethodProperty.deserializeAndSet(SettableBeanProperty.java:414)
at org.codehaus.jackson.map.deser.BeanDeserializer.
从查看堆栈跟踪和调试来看,因为我的模块已经设置如下:
module.addDeserializer(List.class, new JsonMapDeserializer());
当进行反序列化时,似乎在我的对象中的第一个属性(一个列表)上出现问题,因为它抱怨的是一个字符串列表
searchTerm1
。请问有人能指导我如何反序列化类型化对象的列表,或者如何正确添加反序列化程序。如果我将adddeserializer
方法更改为:module.addDeserializer(List<ObjectA>.class, new JsonMapDeserializer());
由于反序列化类被定义为List<ObjectA>
,因此出现了编译器问题。