解决com.fasterxml.jackson.databind.JsonMappingException: No suitable 以 Jackson 处理复杂类型(List,map)两种方法

出现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>>() {});   

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值