你好,我有一个发布版本中的库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
4条答案
按热度按时间8ljdwjyq1#
在发布版本中,Android编译器压缩并优化代码see Android doc(https://developer.android.com/studio/build/shrink-code)。R8删除了一些明显无用的信息,这些信息是Gson正确序列化对象所必需的。为了防止R8剥离这些信息,您需要将以下代码添加到proguard-rules.pro文件中:
-keep class com.giacomociardini.error02.entities.**{ <fields>; }
有关其他详细信息,您可以参考官方Gson GitHub回购协议上的此示例。
tsm1rwdh2#
您需要
@Expose
而不是@SerializedName
5ktev3wc3#
显然,要使Gson库正常工作,需要解析类中的
toString()
方法。我不知道为什么,但如果你知道的话,你可以自由地回应!
添加
toString()
方法是向发布版本添加信息的一个小技巧,您应该按照正确的方法进行操作,并添加亲卫规则。t1rydlwq4#
我在www.example.com类的内部类中遇到了这个问题Model.java,所以我对proguard.pro该项目的www.example.com文件执行了此操作,内部类在proguard中用“$”定义,因此,
在Android Studio 3.4中,默认情况下所有项目都使用R8,因此如果您需要切换到proguard,请:
在www.example.com中为android.enableR8 = falsegradle.properties;或者在您的build. gradle中使用Proguard = true。