Gson反序列化JSON时丢失originalFileName属性的原因及解决办法
Gson反序列化丢失originalFileName字段问题原因及解决方案
问题产生原因
Gson反序列化过程中originalFileName字段丢失,通常是以下几类原因导致:
- 字段名不匹配:Gson默认严格匹配JSON字段名和Java类字段名,若JSON中字段名拼写、大小写、命名风格(如下划线命名
original_file_name和驼峰命名originalFileName)不对应,会直接跳过该字段解析。 - 字段修饰符异常:如果
VideoBean类中originalFileName字段被transient或static关键字修饰,Gson默认会排除这类字段的序列化/反序列化逻辑。 - 字段被配置为排除解析:
- 字段添加了
@Expose(deserialize = false)注解,且Gson实例开启了excludeFieldsWithoutExposeAnnotation()配置 - 自定义了Gson字段排除规则,将
originalFileName纳入了排除列表
- 字段添加了
- 类型不匹配:JSON中
originalFileName的值类型和Java类中定义的字段类型不兼容(比如JSON中是数值类型,Java类中定义为String类型),默认配置下Gson解析失败会静默跳过该字段,不会抛出异常。 - 代码混淆导致字段名被修改:打包时开启了ProGuard/R8混淆,
VideoBean的字段名被混淆为无意义的短命名,和JSON中的字段名无法匹配。
解决方案
针对上述原因,可对应采取以下方案保障反序列化正常:
- 字段名适配:优先保证JSON和Java类字段名完全一致,也可以直接给Java字段添加
@SerializedName注解强制绑定对应JSON字段,支持多别名适配:@SerializedName(value = "originalFileName", alternate = {"original_file_name", "sourceFileName"}) private String originalFileName; - 移除异常修饰符:去掉
originalFileName字段的transient、static修饰符,定义为普通实例成员变量。 - 调整解析排除规则:
- 若开启了
excludeFieldsWithoutExposeAnnotation(),给originalFileName添加@Expose(deserialize = true)注解 - 调整自定义排除规则,将
originalFileName从排除列表移除
- 若开启了
- 统一字段类型:保证JSON中
originalFileName的值类型和Java类中定义的类型一致,特殊场景可自定义TypeAdapter实现类型转换。 - 新增混淆豁免规则:在混淆配置文件中添加规则,禁止混淆
VideoBean类及内部成员:-keep class 你的实际包名.VideoBean { *; } - 开启Gson容错配置:创建Gson实例时开启宽松解析规则,降低格式兼容问题导致的解析失败概率:
Gson gson = new GsonBuilder().setLenient().create();
内容的提问来源于stack exchange,提问作者李国兵
相关产品推荐
相关产品推荐

