我正在编写一个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')
}
3条答案
按热度按时间hrirmatl1#
您在
release
构建类型-minifyEnabled true
中启用了ProGuard。它通过更改类/变量名来混淆代码。您应该为类属性添加注解,这样Gson就知道要查找什么:
这样,Gson就不会查看属性的名称,而是查看
@SerializedName
注解。35g0bw712#
您可以使用@Egor N提到的
@SerializedName
,也可以使用以下命令将Gson类添加到proguard-rules.pro
与前者相比,后者具有以下优点:
@SerializedName
添加到Gson类中的每个字段中不仅非常耗时,尤其是在包含大量Gson文件的大型项目中,而且如果@SerializedName
中的参数与字段名不同,还会增加输入代码时出错的可能性。@SerializedName
,则会由于名称冲突而导致运行时崩溃。eoigrqb63#
在pro-guard文件中添加此行