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

通过GSON反序列化JSON时的java.lang.IllegalArgumentException,java,android,json,gson,Java,Android,Json,Gson,我有一个模型类,在将其发送到Android服务时,我希望通过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.c

我有一个模型类,在将其发送到Android服务时,我希望通过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 */ }

}
以下是给出例外情况的TutorProfile ResponseView:

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 

有人知道我遗漏了什么吗?

直观地看问题,它不应该存在,但是类
java.util.AbstractMap
在这里有扭曲。我为Gson尝试了一个定制的
TypeAdapter
,但没有成功。我本来可以编写一个自定义反序列化程序,但随着数据模型的更改,我会有一个新的依赖项需要处理,因此自定义反序列化程序远不是理想的解决方案。除了我自己的类(从
java.util.AbstractMap
扩展而来)之外,我试图找出所有问题。您可以看到,它将Object作为类型参数,允许将任何内容放入映射中。没有类型信息。显示(根据类)Gson或任何其他JSON反序列化程序可以用来确定正确的类型

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


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

直观地看问题,它不应该存在,但是类
java.util.AbstractMap
在这里有一些扭曲。我为Gson尝试了一个定制的
TypeAdapter
,但没有成功。我本来可以编写一个自定义反序列化程序,但随着数据模型的更改,我会有一个新的依赖项需要处理,因此自定义反序列化程序远不是理想的解决方案。除了我自己的类(从
java.util.AbstractMap
扩展而来)之外,我试图找出所有问题。您可以看到,它将Object作为类型参数,允许将任何内容放入映射中。没有类型信息。显示(根据类)Gson或任何其他JSON反序列化程序可以用来确定正确的类型

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


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

删除扩展,然后重试。@Mehdi:这就是问题所在:这是由Google客户端API生成器生成的代码。我不能插手这些课程。听起来很像。您的ProGuard配置文件中是否有
-keepattributes签名
?请删除扩展名并重试。@Mehdi:这就是问题所在:这是由Google客户端API生成器生成的代码。我不能插手这些课程。听起来很像。您的ProGuard配置文件中是否有
-keepattributes签名
java.lang.Object
    java.util.AbstractMap<String,Object>
        com.google.api.client.util.GenericData
            com.google.api.client.json.GenericJson 
-keep class com.google.gson.stream.** { *; }
-keep class com.learncity.searchApi.model.** { *; }