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

icomxhvb  于 2022-11-06  发布在  其他
关注(0)|答案(4)|浏览(193)

你好,我有一个发布版本中的库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

8ljdwjyq

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回购协议上的此示例。

tsm1rwdh

tsm1rwdh2#

您需要@Expose而不是@SerializedName

@Expose
public String a;
5ktev3wc

5ktev3wc3#

显然,要使Gson库正常工作,需要解析类中的toString()方法。
我不知道为什么,但如果你知道的话,你可以自由地回应!
添加toString()方法是向发布版本添加信息的一个小技巧,您应该按照正确的方法进行操作,并添加亲卫规则。

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

t1rydlwq4#

我在www.example.com类的内部类中遇到了这个问题Model.java,所以我对proguard.pro该项目的www.example.com文件执行了此操作,内部类在proguard中用“$”定义,因此,

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

在Android Studio 3.4中,默认情况下所有项目都使用R8,因此如果您需要切换到proguard,请:
在www.example.com中为android.enableR8 = falsegradle.properties;或者在您的build. gradle中使用Proguard = true。

相关问题