1. ホーム
  2. Java

com.fasterxml.jackson.databind.JsonMappingException を解決してください。複雑な型(リスト、マップ)を2つの方法で処理するために、ジャクソンに適したものはありません。

2022-02-19 13:32:40

JsonMappingException。No suitableは様々な方法で発生する可能性があり、ケースバイケースで処理されます。

原因1

json文字列からjava beanへの変換にjacksonを使用すると、以下のエラーが発生します。

JsonMappingException: No suitable constructor found for type [simple type, class org.test. 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 ;    

    //add a constructor without parameters  
    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;    
    }  

}  

第2シナリオ

dataListentity json2=[{"num":122,"red":"bright red 22","green":"light green 22"}]  
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of text.TextEntity out TextEntity out of START_ARRAY token  
 at [Source: [{"num":122,"red":"bright red 22","green":"light 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)を扱うには、以下のメソッドを使う必要があります。

方法1:

String cols="[{'id':'3'},{'id':'3'}]";  
ObjectMapper mapper = new ObjectMapper();  
JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, Bean.class);  
//Map type    
mapper.getTypeFactory().constructParametricType(HashMap.class, String.class, Bean.class);  
List<Bean> lst = (List<Bean>)mapper.readValue(cols, javaType);   





方法2

String jsonString="[{'id':'1'},{'id':'2'}]";  
ObjectMapper mapper = new ObjectMapper();  
List<Beans> beanList = mapper.readValue(jsonString, new TypeReference<List<Beans>>() {});