1. 程式人生 > >【exceptions】java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to xxxxx

【exceptions】java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to xxxxx

這個問題是我在用jackson將字串準換成指定物件的List,轉換的時候沒有異常,但是通過for迴圈拿出物件使用的時候出現的問題.原來我的轉換是寫在controller裡面,後來為了通用準備寫到工具類中,但是發現一個問題,就是在controller中可以正確轉換並在service中使用,通過工具類來獲取後就在service中使用出丟擲這個異常.

jackson中的問題

  • controller中的處理
// json解析器
ObjectMapper om = new ObjectMapper();
// 解析出來的所有明細
List<XXX> list = null;
try
{ details = om.readValue(getPara("json"), new TypeReference<List<XXX>>() { }); } catch (IOException e) { log.info("json解析失敗:" + e.getMessage()); return; }

這樣的處理結果是正確的,可以正常使用,但是寫在工具類中出現了這個異常

  • 工具類中的處理
@SuppressWarnings("unchecked")
public static <T> List
<T> parseJsonList(String json, Class<T> clazz) { try { ObjectMapper INSTANCE = new ObjectMapper(); return (List<T>) INSTANCE.readValue(json, new TypeReference<List<T>>() { }); } catch (IOException e) { e.printStackTrace(); } return
null; }

轉換沒有出現問題,但是到使用的時候,這個List裡面的物件是LinkedHashMap,並沒有轉化成我需要的T.導致了這個問題

  • 解決方法
  /**
    * @param json 準備轉換json
    * @param clazz 集合元素型別
    * @return
    * @description json字串轉換成物件集合
    * @author paul
    * @date 2017年8月12日 下午1:28:27
    * @update 2017年8月12日 下午1:28:27
    * @version V1.0
    */
@SuppressWarnings("unchecked")
public static <T> List<T> parseJsonList(String json, Class<T> clazz) {
    try {
        JavaType javaType = getCollectionType(ArrayList.class, clazz); 
        return (List<T>) INSTANCE.readValue(json, javaType);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

/**
 * @param collectionClass 集合類
 * @param elementClasses 集合元素類
 * @return
 * @description 獲取泛型的ColloectionType
 * @author paul
 * @date 2017年8月12日 下午2:17:38
 * @update 2017年8月12日 下午2:17:38
 * @version V1.0
 */
private static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {   
    return INSTANCE.getTypeFactory().constructParametricType(collectionClass, elementClasses);   
}

這個方法是我在網上找到的一個可用的方法,解決了這個問題。我懷疑jackson底層封裝預設用了LinkedHashMap,所以出現了這個問題。

  • 舉個栗子:
    有一個想要轉化的結果類User為:
public class User {
    private int id;
    private String code;
    private String name;
    //...(getter,setter)
}

有一個工具類:

public class JsonUtil{
      /**
    * @param json 準備轉換json
    * @param clazz 集合元素型別
    * @return
    * @description json字串轉換成物件集合
    * @author paul
    * @date 2017年8月12日 下午1:28:27
    * @update 2017年8月12日 下午1:28:27
    * @version V1.0
    */
    @SuppressWarnings("unchecked")
    public static <T> List<T> parseJsonList(String json, Class<T> clazz) {
        try {
            JavaType javaType = getCollectionType(ArrayList.class, clazz); 
            return (List<T>) INSTANCE.readValue(json, javaType);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @param collectionClass 集合類
     * @param elementClasses 集合元素類
     * @return
     * @description 獲取泛型的ColloectionType
     * @author paul
     * @date 2017年8月12日 下午2:17:38
     * @update 2017年8月12日 下午2:17:38
     * @version V1.0
     */
    private static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses)  {   
        return INSTANCE.getTypeFactory().constructParametricType(collectionClass, elementClasses);   
    }
}

在需要轉換的地方如此呼叫就可以了:

String json = "{\"id\":1,\"code\":\"wang\",\"name\":\"\"}";//一個示意json
List<User> users = JsonUtil.parseJsonList(json, User.class);//獲取到了指定型別的list

推薦fastjson

fastjson是alibaba提供的解決json相關的工具包,很好用。這個問題在fastjson我試了一下沒有問題,可以完美解決。

List<User> users= JSONObject.parseArray(json, User.class);

完美解決,推薦指數☆☆☆☆☆

我的部落格中有一個JsonUtil工具類,不定時更新,解決方法也在裡面

相關推薦

exceptionsjava.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to xxxxx

這個問題是我在用jackson將字串準換成指定物件的List,轉換的時候沒有異常,但是通過for迴圈拿出物件使用的時候出現的問題.原來我的轉換是寫在controller裡面,後來為了通用準備寫到工具類中,但是發現一個問題,就是在controller中可以正

java.lang.ClassCastException: xxx.bean.XXX cannot be cast to xxx.bean.YYY

java.lang.ClassCastException: com.hahah.atcrowdfunding.bean.User cannot be cast to com.hahah.atcrowdfunding.bean.Role result寫錯了,應該是re

java.lang.ClassCastException: com.github.pagehelper.PageHelpercannot be cast to org.apache.Intercept

使用pagehelper外掛時出現的異常。 我原先mybatis的配置如下 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Con

java.util.LinkedHashMap cannot be cast to com.*** resetTemplate的GET請求返回值為帶泛型的型別

原因:             resetTemplate的GET請求返回值為帶泛型的型別不可以直接使用,因為他內部封裝成了一個LinkedHashMap,所以我們直接用的時候就會報錯 解決:  

java.util.LinkedHashMap cannot be cast to xxJavaBean

集合 obj arr 數據 linked shm 方式 style object // 前提/map.get("listKey")為List集合List<JavaBean> list = (List<JavaBean>) map.get("list

Spring Web's RestTemplate, exchange. java.util.LinkedHashMap cannot be cast to

public class ReturnData<E> implements Serializable {     private int code;     private E data;     private String msg;          pub

springboot分頁條件查詢java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pageh

java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Page at com.boku.www.service.impl.Projec

分頁外掛不起效果java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.github.pagehelper.Pa

錯誤程式碼 public List findUserPageFromMybatis(HttpServletRequest request, Integer pageNum, Integer pageSize) { pageNum = pageNum ==

java筆記)ClassCastException: java.util.Date cannot be cast to java.sql.Date

目的 根據oracle資料庫中的一個日期欄位,利用Java程式碼自動更新資料庫中的資料。 難點 資料庫中的資料欄位為 LEASEDAY | DATE型別 在java這邊的條件為字串日期 yyyy-mm-dd | String型別 由

org.apache.catalina.util.DefaultAnnotationProcessor cannot be cast to org.ap解決方案

是tomcat的lib資料夾jar包和專案的lib檔案下的jar包衝突了 把專案下lib檔案下和tomcat的jar的重複的全部刪除。 注意,如果你是先建flex工程然後轉成web形式的,請把專案中tomcat類庫刪除,不然還會衝突   第二種解決辦法 &nb

添加最新版本的mysql的jdbc連接jar包java.math.BigInteger cannot be cast to java.lang.Long異常

復制 bubuko str 操作 cannot image cbe Beam 鏈接 【問題描述】 從我的電腦把項目拷貝到guo小中的win8電腦,but出現了那個錯誤,估計他的mysql是最新版本的。 【如何下載連接jar包】 鏈接:https://pan.bai

2類型轉換異常:Exception in thread "main" java.lang.ClassCastException:java.lang.Object cannot be cast to java.lang.Integer

cnblogs color pan rgs main string [] 類型 style public class TestException { public static void main(String[] args) { Object obj

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

protocol lang base arr ava ebs reat rac context 1、錯誤描寫敘述java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Str

WebLogic部署報java.lang.ClassCastException: weblogic.xml.jaxp.RegistrySAXParserFactory cannot be cast to javax.xml.parsers.SAXParserFactory

jar包 使用 jar包沖突 ava 項目 div factor c項目 sax 今天在部署WebLogic項目時,報了java.lang.ClassCastException: weblogic.xml.jaxp.RegistrySAXParserFactory cann

tomcat啟動報錯:java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to..

啟動tomcat的專案報錯如下: 解決思路: 1.看到這個錯誤,java.lang.ClassCastException: org.apache.jasper.runtime.ELContextImpl cannot be cast to org.apache.jasper.el.ELC

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer

在開發中,遇到這麼一個錯誤: 報錯的意思: Long 無法轉化成Integer型別. 網上的解釋是:     這裡在Hibernate2.0之前版本list.get(0)返回的是Integer型別.但是在Hibernate3.0以後版本list.ge

java.lang.ClassCastException: java.math.BigInteger cannot be cast to java.lang.Long

MySQL更新到8.0.11之後連線資料庫時會報出錯誤 Your login attempt was not successful, try again. Reason: Could not get JDBC Connection; nested exception is java.sql.SQ

Cause: java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.ibatis.mapping.MappedStatement

 我用的是pagehelper 4.2.0,利用其進行表單的分頁處理並進行展示,在第一次執行的時候能夠看到分頁後的結果,重新整理一下第二次就顯示不出來,控制檯出現:  Cause: java.lang.ClassCastException: java.lang.String cannot

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to java.lang.Int

異常:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to java.lang.Integer 原因:SQL查詢結果為count()統計結果個數,gson返回資料為js

java lang ClassCastException java lang Integer cannot be ca

                1、錯誤描述java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String service.impl.ArrivalBillServiceImpl.exportBillExce