2017-03-04 3 views
1

Ich habe eine Modellklasse, die ich will durch Gson serialisiert/deserialisiert, während er an einem Android-Service zurückschicken:java.lang.IllegalArgumentException während Deserialisieren JSON durch 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 */ } 

} 

ich eine Ausnahme bin immer während der Deserialisierung JSON-String:

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) 

Hier ist die TutorProfileResponseView die Ausnahme geben:

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 */ } 
} 

Falls Sie die Klassenhierarchie für com.google.api.client.json.GenericJson hier wissen wollen, ist:

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

ich die folgenden zwei Regeln in proguard Datei setzen versucht haben:

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

Hat jemand eine Idee, was Ich vermisse?

+0

Entfernen Sie die Erweiterungen und versuchen Sie es erneut. – Mehdi

+0

@Mehdi: Das ist das Problem: Dies ist Code von Google Client-API-Generator generiert. Ich kann mich nicht in diese Klassen einmischen. –

+0

Es klingt sehr ähnlich zu http://stackoverflow.com/questions/42553204/how-to-convert-json-to-vector-classcastexception-gson-android-4-4-2#comment72242065_42553204. Haben Sie in Ihrer ProGuard-Konfigurationsdatei "-kennzeichnet Signatur"? –

Antwort

0

Intuitiv das Problem betrachtend, sollte es nicht existieren, aber die Klasse java.util.AbstractMap<String,Object> hat hier die Wendung. Ich habe eine benutzerdefinierte TypeAdapter für den Gson versucht, aber es hat nicht geklappt. Ich hätte einen benutzerdefinierten Deserializer schreiben können, aber da sich das Modell meiner Daten ändert, würde ich eine neue Abhängigkeit haben, um die ich mich zu dieser Zeit kümmern müsste, so dass ein benutzerdefinierter Deserializer hier keine ideale Lösung darstellt. Ich habe versucht, das Problem mit allem außer meiner eigenen Klasse zu finden, die sich von java.util.AbstractMap<String,Object> erstreckt. Sie können sehen, dass es einen Objekt als Typparameter hat, der es ermöglicht, alles in die Map einzufügen. Es gibt keine Typinformationen. vorhanden (gemäß der Klasse), die Gson oder ein anderer JSON-Deserializer verwenden kann, um den richtigen Typ herauszufinden.

Die Lösung ist jetzt - es gibt keinen mit Gson oder JSON Deserializer, aber das ist ein Indikator, dass Sie Ihre Modellstruktur ändern oder Änderungen an einer anderen Designentscheidung in Ihrer Anwendung vornehmen müssen. Ich habe Änderungen am Design vorgenommen, um das zu umgehen.

Natürlich, wenn Sie den Typ im Voraus kennen, würde ein TypeAdapter oder Deserializer wahrscheinlich Ihr Problem lösen.

Verwandte Themen