2017-03-04 81 views
1

反序列化JSON我有我想要序列/通過GSON反序列化,同時將其發送到一個Android服務模型類:java.lang.IllegalArgumentException異常,同時通過GSON

public final class SearchTutorsQuery extends com.google.api.client.json.GenericJson { 
    @com.google.api.client.util.Key 
    private com.learncity.searchApi.model.LatLng location; 
    @com.google.api.client.util.Key 
    private java.util.List<java.lang.String> subjects; 
    @com.google.api.client.util.Key 
    private com.learncity.searchApi.model.TutorProfileResponseView tutorProfileResponseView; 
    @com.google.api.client.util.Key 
    private java.util.List<java.lang.String> tutorTypes; 

    public SearchTutorsQuery() { /* compiled code */ } 

} 

而反序列化我得到一個異常JSON字符串:

java.lang.IllegalArgumentException: field com.learncity.searchApi.model.SearchTutorsQuery.tutorProfileResponseView has type com.learncity.searchApi.model.TutorProfileResponseView, got com.google.gson.internal.LinkedTreeMap 
         at java.lang.reflect.Field.set(Native Method) 
         at com.google.api.client.util.FieldInfo.setFieldValue(FieldInfo.java:245) 
         at com.google.api.client.util.FieldInfo.setValue(FieldInfo.java:206) 
         at com.google.api.client.util.GenericData.put(GenericData.java:103) 
         at com.google.api.client.util.GenericData.put(GenericData.java:47) 
         at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:188) 
         at com.google.gson.internal.bind.MapTypeAdapterFactory$Adapter.read(MapTypeAdapterFactory.java:145) 
         at com.google.gson.Gson.fromJson(Gson.java:887) 
         at com.google.gson.Gson.fromJson(Gson.java:852) 
         at com.google.gson.Gson.fromJson(Gson.java:801) 
         at com.google.gson.Gson.fromJson(Gson.java:773) 
         at com.learncity.learner.search.SearchService$SearchHandler.handleMessage(SearchService.java:66) 
         at android.os.Handler.dispatchMessage(Handler.java:102) 
         at android.os.Looper.loop(Looper.java:154) 
         at android.app.ActivityThread.main(ActivityThread.java:6077) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

這裏是給異常TutorProfileResponseView:

public final class TutorProfileResponseView extends com.google.api.client.json.GenericJson { 
    @com.google.api.client.util.Key 
    private java.lang.Integer disciplines; 
    @com.google.api.client.util.Key 
    private com.learncity.searchApi.model.EducationalQualificationResponseView educationalQualification; 
    @com.google.api.client.util.Key 
    private com.learncity.searchApi.model.EducationalQualificationResponseView educationalQualifications; 
    @com.google.api.client.util.Key 
    private java.lang.Integer global; 
    @com.google.api.client.util.Key 
    private java.lang.Integer mCurrentStatus; 
    @com.google.api.client.util.Key 
    private java.lang.Integer mDisplayPicturePath; 
    @com.google.api.client.util.Key 
    private java.lang.Integer mEmailID; 
    @com.google.api.client.util.Key 
    private com.learncity.searchApi.model.LatLngResponseView mLastKnownGeoCoordinates; 
    @com.google.api.client.util.Key 
    private java.lang.Integer mName; 
    @com.google.api.client.util.Key 
    private java.lang.Integer mPassword; 
    @com.google.api.client.util.Key 
    private java.lang.Integer mPhoneNo; 
    @com.google.api.client.util.Key 
    private java.lang.Integer nil; 
    @com.google.api.client.util.Key 
    private com.learncity.searchApi.model.OccupationResponseView occupation; 
    @com.google.api.client.util.Key 
    private java.lang.Integer rating; 
    @com.google.api.client.util.Key 
    private com.learncity.searchApi.model.CreditsResponseView teachingCredits; 
    @com.google.api.client.util.Key 
    private java.lang.Integer tutorTypes; 

    public TutorProfileResponseView() { /* compiled code */ } 
} 

在你想知道的情況下,com.google.api.client.json.GenericJson這裏的類層次結構是:

java.lang.Object 
    java.util.AbstractMap<String,Object> 
     com.google.api.client.util.GenericData 
      com.google.api.client.json.GenericJson 

我試圖把下面的2規則proguard的文件:

-keep class com.google.gson.stream.** { *; } 
-keep class com.learncity.searchApi.model.** { *; } 

有沒有人有任何想法是什麼我失蹤了?

+0

刪除擴展並重試。 – Mehdi

+0

@Mehdi:問題在於:這是由Google客戶端API生成器生成的代碼。我不能插手這些課程。 –

+0

這聽起來非常類似於http://stackoverflow.com/questions/42553204/how-to-convert-json-to-vector-classcastexception-gson-android-4-4-2#comment72242065_42553204。你的ProGuard配置文件中有'-keepattributes Signature'嗎? –

回答

0

直觀地看問題,它不應該存在,但類java.util.AbstractMap<String,Object>有扭曲在這裏。我爲Gson嘗試了一個自定義的TypeAdapter,但它沒有解決。我可以編寫一個自定義的反序列化器,但隨着我數據更改的模型的不同,我會在當時有一個新的依賴關係來處理,所以自定義的反序列化器在這裏遠非理想的解決方案。我試圖找到除了我自己的課程之外的所有問題,從java.util.AbstractMap<String,Object>延伸。你可以看到它有Object作爲類型參數,允許將任何東西放入地圖中。沒有類型信息。目前(按照類)Gson或任何其他JSON解串器可以用來找出正確的類型。

現在的解決方案是 - 沒有一個使用Gson或JSON解串器,但這是一個指標,您必須更改模型結構或更改應用程序中的其他設計決策。我最終改變了設計來解決這個問題。

當然,如果您事先知道類型,TypeAdapter或反序列化器可能會解決您的問題。

相關問題