通过GSON反序列化JSON时出现java.lang.IllegalArgumentException

时间:2017-03-04 09:26:59

标签: java android json gson

我有一个模型类,我希望在将它发送到Android服务时通过GSON序列化/反序列化:

str1

我在反序列化JSON字符串时遇到异常:

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

}

以下是提供例外的TutorProfileResponseView:

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)

如果你想知道,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

我尝试在proguard文件中添加以下2条规则:

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

有没有人知道我错过了什么?

1 个答案:

答案 0 :(得分:0)

直观地看待问题,它不应该存在,但是类java.util.AbstractMap<String,Object>在这里有变化。我为Gson尝试了一个自定义TypeAdapter,但它没有成功。我本可以编写一个自定义反序列化器,但随着我的数据模型发生变化,我会有一个新的依赖关系来处理,所以自定义反序列化器远不是理想的解决方案。我试图找到问题,除了我自己的类,从java.util.AbstractMap<String,Object>延伸。您可以看到它具有Object作为类型参数,允许将任何内容放入地图中。没有类型信息。存在(根据类)Gson或任何其他JSON解串器可以用来确定正确的类型。

现在的解决方案是 - 没有Gson或JSON反序列化器,但这是一个指示器,您必须更改模型结构或更改应用程序中的其他设计决策。我最终在设计上做了一些改变来解决这个问题。

当然,如果您事先知道类型,TypeAdapter或反序列化器可能会解决您的问题。

相关问题