在用jackson-core-asl-1.9.10.jar和jackson-mapper-asl-1.9.10.jar两个包做json字符串转换Pojo对象时报如下异常:
org.codehaus.jackson.map.JsonMappingException:
Can not deserialize instance of java.util.List out of START_OBJECT token
Java代码如下:
ObjectMapper mapper = new ObjectMapper();
String myajsonstr = "{"myname":{"first":"yu2","last":"shibo2"},"myflag":false,"myversion":"version-1.1","myage":31,"mygender":"FAMALE"}";
List myListBean = mapper.readValue(myajsonstr, new TypeReference>(){});
运行后的信息如下:
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of START_OBJECT token
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContex
t.mappingException(StdDeserializationContex
t.java:198)
at org.codehaus.jackson.map.deser.CollectionDeserializer.handleNonArray(CollectionDeserializer.java:149)
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:107)
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:97)
at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:26)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2395)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1602)
上述问题在网上搜了好久都没找到解决的办法,最后只能根据报错信息去查jackson的API文档,这个过程比较痛苦,就是一个一个的做实验,根据错误信息中的
Can not deserialize instance of java.util.List out of START_OBJECT token这一句基本可以断定是类信息不能被反序列化,到jackson的API文档里(
http://jackson.codehaus.org/1.8.8/javadoc/index.html
)找到DeserializationConfig.Feature这个Enum类,发现其中有个ACCEPT_SINGLE_VALUE_AS_ARRAY属性,大致翻译了一下给的解释,意思是反序列化的作用是确定是否强制让非数组模式的json字符串与java集合类型相匹配。
【解决方法】:在
List myListBean = mapper.readValue(myajsonstr, new TypeReference>(){});这句之前加上mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);这句,
DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY属性默认值是false,其中的
MyAnotherJsonBean.java是笔者迎合json字符串自定义的Pojo类,里面就是基本属性和set、get方法
。