最近接触了 Android 上的一个高效的网络请求处理框架——Retrofit,大量使用注解,很好用,这让笔者联系到了 SpringMVC 框架,也是具有丰富的注解。Retrofit 是对 OkHttp 的封装(都是出自 Square 公司之手),而 OkHttp 又是对 Java HttpURLConnection 的一次封装,它们的关系是 HttpURLConnection -> OkHttp -> Retrofit。这三者笔者都有亲自用过,一个比一个好用。
回到正题,Gson 是配合 Retrofit 解析 JSON 而引入的一个库。初次在项目中使用 Retrofit + Gson,一路也是顺风顺水,发起请求回传数据正常。最后,笔者打包了一个测试版给用户,用户反馈说无法获取到数据。于是经过不断排查(过程略),发现了症结所在。<u>因为笔者在打包 APK 开启了 Proguard 混淆,导致 Bean 对象属性名被打乱,而使 Gson 在转换 JSON 数据到 Bean 对象时无法正确注入(或者说映射)属性值。</u>
那为什么在自己测试时没有发现呢?这是由于调试时没有启用混淆。
下面给出笔者的解决方案(找解过程略):
-
其一,配置 Proguard 规则,留住 Bean 对象属性名。
-
其二,使用 Gson 提供的 SerializedName() 注解标记映射。
总结。出现这个问题其实还是归咎笔者知识的欠缺。记完收工,以备反刍。