Gson fromJson 在 Proguard 之后返回 null

Posted

技术标签:

【中文标题】Gson fromJson 在 Proguard 之后返回 null【英文标题】:Gson fromJson returns null after Proguard 【发布时间】:2021-03-18 16:03:27 【问题描述】:

我们正在使用 Proguard 来混淆我们的 Java 应用程序。我们有一些 POJO 类,其中 Gson 用于在运行时从 json 创建这个对象

package com.example.app;
public class AppConfiguration 

  private String name;
  private String title;
  private String details;


AppConfiguration configuration = new Gson().fromJson(value, AppConfiguration.class);

用proguard混淆后,配置返回null。我已经使用 keep 选项来保留 AppConfiguration,但没有帮助

Progarud 选项

-keep class com.example.app.AppConfiguration

【问题讨论】:

【参考方案1】:

Gson fromJson 期望 POJO 类成员。所以我们需要保留所有的成员变量。(没有 Proguard 混淆这个属性)。下面的 proguard keep 选项保留了 AppConfiguration 的所有属性

字段序列化名称

@SerializedName("keyType")
String keyType;

proguard 配置

-keepclassmembers,allowobfuscation class * 
    @com.google.gson.annotations.SerializedName <fields>;

 

-keep,allowobfuscation @interface com.google.gson.annotations.**

如果您没有机会更改班级,可以使用以下保留选项

-keepclassmembers class com.example.app.AppConfiguration 
        public protected private *;
        #Keep default members & functions
        !public !protected !private *;
    

【讨论】:

如果AppConfiguration 的字段使用@SerializedName 注释,是否需要配置ProGuard 规则? 哦..我没试过。 POJO 类是由另一个团队提供的。这是一个很好的提示。 是的,progaurd 混淆了这些名称,因此 Gson 解析器不知道要匹配哪些值。

以上是关于Gson fromJson 在 Proguard 之后返回 null的主要内容,如果未能解决你的问题,请参考以下文章

如何将枚举类型字段保留在 proguard 中?

如何解决gson.fromJson()在android中有错误

Gson fromJson() 用法

Gson.fromJson没有处理错误的响应

Gson 最常用的功能

是否可以使用 Gson.fromJson() 来获取 ArrayList<ArrayList<String>>?