Gson在发布的apk中反序列化空指针

6qqygrtg  于 2022-11-06  发布在  其他
关注(0)|答案(3)|浏览(164)

我正在编写一个Android应用程序,需要使用gson来反序列化json字符串:

{
    "reply_code": 001,
    "userinfo": {
        "username": "002",
        "userip": 003
    }
}

所以我创建了两个类:

public class ReturnData {
    public String reply_code;
    public userinfo userinfo;
}

public class userinfo {
    public String username;
    public String userip;
}

最后是我在www.example.com中的Java代码MainActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Context context= MainActivity.this;

    //Test JSON
    String JSON="{\"reply_code\": 001,\"userinfo\": {\"username\": \"002\",\"userip\": 003}}";
    Gson gson = new Gson();
    ReturnData returnData=gson.fromJson(JSON,ReturnData.class);

    if(returnData.reply_code==null)
        Toast.makeText(context,"isNULL",Toast.LENGTH_SHORT).show();
    else
        Toast.makeText(context,"notNULL",Toast.LENGTH_SHORT).show();
}

让我困惑的是,当我调试应用时,它运行良好,输出“notNULL”。我可以看到对象的每个属性都被正确地反序列化了。但是,当我从Android Studio生成发布的apk并在手机上运行apk时,它输出“isNULL”,json解析失败!
谁能告诉我发生了什么事!
PS:建筑。等级:

apply plugin: 'com.android.application'
android {
compileSdkVersion 19
buildToolsVersion "19.1"

defaultConfig {
    applicationId "com.padeoe.autoconnect"
    minSdkVersion 14
    targetSdkVersion 21
    versionCode 1
    versionName "2.1.4"
}
buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('src/gson-2.3.1.jar')
}
hrirmatl

hrirmatl1#

您在release构建类型-minifyEnabled true中启用了ProGuard。它通过更改类/变量名来混淆代码。
您应该为类属性添加注解,这样Gson就知道要查找什么:

public class ReturnData {
    @SerializedName("reply_code")
    public String reply_code;
    @SerializedName("userinfo")
    public userinfo userinfo;
}

public class userinfo {
    @SerializedName("username")
    public String username;
    @SerializedName("userip")
    public String userip;
}

这样,Gson就不会查看属性的名称,而是查看@SerializedName注解。

35g0bw71

35g0bw712#

您可以使用@Egor N提到的@SerializedName,也可以使用以下命令将Gson类添加到proguard-rules.pro

-keep class com.packageName.yourGsonClassName

与前者相比,后者具有以下优点:

  • 在编写代码时,你可以把所有的Gson类放在一个文件夹中,并使用下面的代码来防止它们被混淆,这样可以节省大量的代码:
-keep class com.packageName.gsonFolder.**{ *; }
  • @SerializedName添加到Gson类中的每个字段中不仅非常耗时,尤其是在包含大量Gson文件的大型项目中,而且如果@SerializedName中的参数与字段名不同,还会增加输入代码时出错的可能性。
  • 如果在Gson类中使用了任何其他方法,如getter或setter方法,它们也可能会被混淆。如果不对这些方法使用@SerializedName,则会由于名称冲突而导致运行时崩溃。
eoigrqb6

eoigrqb63#

在pro-guard文件中添加此行


## ---------------Begin: proguard configuration for Gson  ----------

# Gson uses generic type information stored in a class file when working with fields. Proguard

# removes such information by default, so configure it to keep all of it.

-keepattributes Signature

# For using GSON @Expose annotation

-keepattributes *Annotation*

# Gson specific classes

-dontwarn sun.misc.**

# -keep class com.google.gson.stream.**{ *; }

# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,

# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)

-keep class * extends com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null

-keepclassmembers,allowobfuscation class * {
  @com.google.gson.annotations.SerializedName <fields>;
}

# Retain generic signatures of TypeToken and its subclasses with R8 version 3.0 and higher.

-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

## ---------------End: proguard configuration for Gson  ----------

相关问题