Java 发布版本存在Gson解析问题-返回的字符串不正确
嗨,我在发布版本中遇到了库Gson的问题 实际上,在我的应用程序的发行版中,使用Java 发布版本存在Gson解析问题-返回的字符串不正确,java,android,json,gson,release,Java,Android,Json,Gson,Release,嗨,我在发布版本中遇到了库Gson的问题 实际上,在我的应用程序的发行版中,使用new Gson().toJson(obj)方法返回一个不正确的字符串 返回的字符串缺少我的对象的某些字段。发布版本是否需要一些缺少的选项? 以下是一些有用的信息: MyClass example = new MyClass("a","b","c","d"); ArrayList<MyClass> listExample = new ArrayList<MyClass>(); listExa
new Gson().toJson(obj)
方法返回一个不正确的字符串
返回的字符串缺少我的对象的某些字段。发布版本是否需要一些缺少的选项?
以下是一些有用的信息:
MyClass example = new MyClass("a","b","c","d");
ArrayList<MyClass> listExample = new ArrayList<MyClass>();
listExample.add(example);
String strObj = new Gson().toJson(listExample);
是obj
ArrayList
- 我正在使用
implementation'com.google.code.gson:gson:2.8.5'
- 我正在使用Android Studio 3.5.1
MyClass example = new MyClass("a","b","c","d");
ArrayList<MyClass> listExample = new ArrayList<MyClass>();
listExample.add(example);
String strObj = new Gson().toJson(listExample);
预期产量
要重现错误,只需遵循github:
您需要
@公开而不是@SerializedName
@Expose
public String a;
显然,需要解析类中的toString()
方法才能使Gson库正常工作
我不知道为什么,但如果你知道的话,你可以自由地回应
添加toString()
方法是向发布版本添加信息的一个小技巧。你应该按照正确的方法来做,并添加专业的守卫规则
@Override
public String toString() {
return "MyClass{" +
"a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
在发布版本中构建Android编译器收缩和优化代码。R8删除了一些显然无用的信息,这些信息是Gson正确序列化对象所必需的。要防止R8删除此信息,您需要将以下代码添加到proguard-rules.pro文件中:
-保留类com.giacomociardini.error02.entities.*{;}
有关其他详细信息,您可以参考官方Gson repo上的此示例。我在Model.java类的内部类中遇到了此问题,因此我对该项目的proguard.pro文件进行了此操作,内部类在proguard so中用“$”定义
-keep class path_to_models.Models$MyClass { <fields>; }
-保留类路径到模型。模型$MyClass{;}
在Android Studio 3.4中,所有项目默认使用R8,因此如果需要切换到proguard,则:
android.enableR8=gradle.properties中的false;或
在build.gradle中使用useProguard=true。像这样@SerializedName(“a”)@公开私有整数a
或@公开私有整数a
不起作用。你能用所有方法和构造函数显示整个MyClass
吗?@MichałZiober没有太多内容,MyClass有两个构造函数,一个是空的,另一个是所有字段的。像这个例子一样,这个类有所有的get和set方法,我不喜欢共享这个类,因为它有50多个字段。今天,我将尝试重新创建一个带有错误的小示例,并将其发布到github上。实际上,它是有效的!非常感谢,我假设android减少了文件维度,但我不知道存在定义什么是和什么不是的规则。
@Override
public String toString() {
return "MyClass{" +
"a='" + a + '\'' +
", b='" + b + '\'' +
", c='" + c + '\'' +
", d='" + d + '\'' +
'}';
}
-keep class path_to_models.Models$MyClass { <fields>; }