出現com.fasterxml.jackson.databind.JsonMappingException: No suitable 的情況有很多種,具體情況具體對待。
原因一:
在使用jackson 進行json字符串轉java bean的時候出現如下錯誤,
com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class org.test.Library]: can not instantiate from JSON object (need to add/enable type information?) at [Source: java.io.StringReader@d1831; line: 1, column: 2]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:983)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:276)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
原因java bean中沒有提供無參的構造函數,如下
public class Library {
private String name;
private List<Book> bookList ;
//添加無參的構造器
public Library(){
}
public Library(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Book> getBookList() {
return bookList;
}
public void setBookList(List<Book> bookList) {
this.bookList = bookList;
}
}
第二種情況:
dataListentity json2=[{"num":122,"red":"豔紅色的22","green":"淡綠色的22"}]
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of text.TextEntity out of START_ARRAY token
at [Source: [{"num":122,"red":"豔紅色的22","green":"淡綠色的22"}]; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:762)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:758)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromArray(BeanDeserializerBase.java:1211)
at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:147)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:126)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2161)
原因:Can not deserialize instance of text.TextEntity out of START_ARRAY token這一句基本可以斷定是類信息不能被反序列化。所以就需要用到下面的方法進行處理複雜類型(List,map)
方法一:
String cols="[{'id':'3'},{'id':'3'}]";
ObjectMapper mapper = new ObjectMapper();
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Bean.class);
//Map類型
mapper.getTypeFactory().constructParametricType(HashMap.class,String.class, Bean.class);
List<Bean> lst = (List<Bean>)mapper.readValue(cols, javaType);
方法二:
String jsonString="[{'id':'1'},{'id':'2'}]";
ObjectMapper mapper = new ObjectMapper();
List<Bean> beanList = mapper.readValue(jsonString, new TypeReference<List<Bean>>() {});