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>>() {});
関連
-
javaの非静的メソッドを静的に参照することができない
-
SLF4J: クラス・パスに複数のSLF4Jバインディングが含まれています。
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
Uncaught ReferenceError: は定義されていません。
-
java.sql.SQLException: 結果セットの開始前
-
java send https request prompt java.security.cert.について。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
Java:未解決コンパイル問題の解決方法
-
WatchDog + Redisによる分散ロック
-
ロンボク版問題による血の海を思い出せ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
executeQuery()でデータ操作文が発行できない。解決方法
-
無効なメソッド宣言
-
SocketException java.netの4つの例外解決策。
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
org.xml.sax.SAXParseExceptionのエラー解決方法
-
linux ant Resolve error: main class not found or couldn't be loaded org.apache.tools.ant.launcher.
-
Zipファイルの圧縮・解凍にantを使用する
-
java1.8ソースコード ArrayListソースコード解釈