Java 发布版本存在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

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

实际上,在我的应用程序的发行版中,使用
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的构建方式如下:

示例:

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>; }