GSON數據解析異常報錯java.lang.IllegalArgumentException: Unable to create converter for

創維v5機型gson解析數據造成應用閃退

異常log要點:java.lang.NoSuchMethodError: com.google.gson.Gson.newJsonReader

異常log要點:java.lang.IllegalArgumentException: Unable to create converter for <class>

項目使用框架:retrofit2+rxjava2+gson

測試環境:Android4.4 HISIV510

gson依賴版本:2.6.2 / 2.8.2

github提問鏈接:https://github.com/google/gson/issues/1552

stackoverflow提問鏈接:https://stackoverflow.com/questions/57052546/java-lang-illegalargumentexception-unable-to-create-converter-for

 

通過抓到的log日誌,初步判斷是gson數據解析異常,所以本人首先嚐試自定義TypeAdapter,繼承read和write方法去手動解析json,這個方法成功的解決了報錯的數據接口解析失敗

Gson builder = new GsonBuilder()
     .registerTypeAdapter(ColumnInfo.class, new ColumnInfoAdapter())
     .registerTypeAdapter(PhoneWorksInfo.class, new PhoneWorksInfoAdapter(context))
     .create();

但是,另一個數據接口也報錯了,這樣子的話可能所有json數據接口都需要寫一個TypeAdapter,工作量太大了,只能放棄這種解決思路。

 

解決方案:

通過分析app在V5機型的安裝日誌,發現如下信息:

07-18 11:05:22.388 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/ExclusionStrategy;' has an earlier definition; blocking out
​
07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/FieldAttributes;' has an earlier definition; blocking out
​
07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/FieldNamingStrategy;' has an earlier definition; blocking out
​
07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/Gson;' has an earlier definition; blocking out
​
07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/GsonBuilder;' has an earlier definition; blocking out
​
07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/InstanceCreator;' has an earlier definition; blocking out
​
07-18 11:05:22.390 D/dalvikvm( 4392): DexOpt: 'Lcom/google/gson/JsonDeserializationContext;' has an earlier definition; blocking out

應用使用的是設備本身更早版本的gson庫,而不是app中配置版本的gson庫,所以決定在項目中手動集成gson。

 

首先在github上把gson源碼拉下來,並且導入module到項目中,然後把com.squareup.retrofit2:converter-gson中的三個類也添加到項目中,並且都改掉包名,成功解決問題!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章