嗨,我在发布版本中对Gson库有问题。
实际上,在我的应用程序的发行版中,使用new Gson().toJson(obj)
方法返回了错误的字符串。
返回的字符串缺少我对象的某些字段。发行版本是否可能需要一些缺少的选项?
以下是一些有用的信息:
obj
是ArrayList<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
您需要安装@Expose
的@SerializedName
@Expose
public String a;
显然,解析类内部需要toString()
方法,才能使Gson库正常工作。
我不知道为什么,但是如果您知道,您可以随时回复!
@Override
public String toString() {
return "MyClass{" +
"a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
在发行版中,Android编译器缩小并优化代码[see Android doc]。 R8删除一些显然无用的信息,这些信息对于Gson正确序列化对象是必需的。为了防止R8删除此信息,您需要将以下代码添加到proguard-rules.pro文件中:
-keep class com.giacomociardini.error02.entities.** { <fields>; }
有关其他详细信息,请参考官方Gson GitHub存储库上的此示例。