发布版本的Gson解析问题-返回了不正确的字符串



嗨,我在发布版本中遇到了Gson库的问题。

实际上,在我的应用程序的发布版本中,使用new Gson().toJson(obj)方法会返回一个不正确的字符串。

返回的字符串缺少我的对象的某些字段。发布版本是否可能需要一些缺失的选项

以下是一些有用的信息:

  • objArrayList<MyClass>的一个实例
  • 我正在使用implementation 'com.google.code.gson:gson:2.8.5'
  • 我正在使用Android Studio 3.5.1

MyClass是这样构建的:

public class MyClass{
@SerializedName("a")
private String a;
@SerializedName("b")
private Integer b;
@SerializedName("c")
private String c;
@SerializedName("d")
private String d;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
...
}

示例:

MyClass example = new MyClass("a","b","c","d");
ArrayList<MyClass> listExample = new ArrayList<MyClass>();
listExample.add(example);
String strObj = new Gson().toJson(listExample);

电流输出:

[ 
{ 
"b":"b",
"c":"c",
"d":"d",
}
]

预期输出

[ 
{ 
"a":"a",
"b":"b",
"c":"c",
"d":"d",
}
]

要重现错误,只需按照github:https://github.com/Ciardini/error02

在发行版中构建Android编译器收缩和优化代码[请参阅Android文档]。R8删除了一些明显无用的信息,这些信息是Gson正确序列化对象所必需的。为了防止R8剥离这些信息,您需要将以下代码添加到proguard-rules.pro文件中:

-keep class com.giacomociardini.error02.entities.** { <fields>; }

有关其他详细信息,您可以参考Gson GitHub官方回购上的此示例。

您需要@Expose而不是@SerializedName

@Expose
public String a;

显然,解析类中的toString()方法是使Gson库工作所必需的

我不知道为什么,但如果你知道,你可以自由回应

添加toString()方法是向发布版本添加信息的一个小技巧。你应该遵循正确的方式来做这件事,并添加亲卫队的规则。

@Override
public String toString() {
return "MyClass{" +
"a='" + a + ''' +
", b='" + b + ''' +
", c='" + c + ''' +
", d='" + d + ''' +
'}';
}

我在Model.java类的内部类中遇到了这个问题,所以我对该项目的proguard.pro文件进行了处理,内部类在proguard中用'$'定义,因此,

-keep class path_to_models.Models$MyClass { <fields>; }

在Android Studio 3.4中,R8默认用于所有项目,因此如果您需要切换到proguard,则:

android.enableR8=gradle.properties中的false;或useProguard=true在您的build.gradle.中

最新更新