You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Release构建开启混淆后JSON转List返回空数组问题排查

问题根源

这个问题我之前也踩过坑——完全是Proguard混淆导致Gson无法正确映射你的MyList实体类。当Release构建开启minifyEnabled true时,Proguard会把代码里的类名、字段名压缩成无意义的短标识符(比如把topic改成a),而Gson是靠类字段名和JSON里的key一一对应来解析数据的,混淆后字段名不匹配,自然解析不出内容,返回空数组。

解决办法

给你几个实用的解决方案,选适合你的就行:

方法1:给实体类加Gson注解(推荐)

直接在MyList类和它的字段上添加注解,明确告诉Gson映射关系,同时防止类被混淆:

import com.google.gson.annotations.SerializedName;
import androidx.annotation.Keep;

// @Keep 告诉Proguard不要混淆这个类和它的成员
@Keep
public class MyList {
    // @SerializedName 指定JSON里的key和类字段的对应关系
    @SerializedName("topic")
    private String topic;
    
    @SerializedName("subMessage")
    private String subMessage;
    
    @SerializedName("people")
    private List<People> people; // 如果People是嵌套实体类,同样要加注解或排除混淆

    // 构造方法、getter/setter按需添加
}

这种方式最稳妥,即使后续字段名修改,只要注解对应上JSON key就不会出问题。

方法2:在Proguard规则里添加排除规则

如果不想给每个实体类加注解,直接在proguard-rules.pro文件里配置,让Proguard放过你的实体类和Gson核心类:

# 保留Gson的核心组件不被混淆
-keep class com.google.gson.** { *; }
-keep class com.google.gson.annotations.** { *; }

# 替换成你自己的实体类所在包名,保留该包下所有类不被混淆
-keep class com.yourapp.models.** { *; }

# 必须保留注解和泛型签名,否则Gson处理泛型列表会出问题
-keepattributes Signature
-keepattributes *Annotation*

方法3:针对序列化的通用规则

如果你的实体类实现了Serializable接口,还可以加上这条规则,确保序列化相关的信息不被混淆:

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
额外提醒
  • 别忘了处理嵌套的实体类!比如people字段对应的People类,也要做同样的混淆排除,不然嵌套列表依然会是空的。
  • 调试Release构建时,可以临时把debuggable true加上,这样你就能在Release模式下查看混淆后的类结构,确认问题是否解决。

内容的提问来源于stack exchange,提问作者user9765778

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:43:06