问题描述
在启用 minify 后解析 JSON 响应中的单个字段时遇到问题,禁用 minify 后一切正常:
改造 API 调用:
@FormUrlEncoded
@POST("/api/test")
fun test(@Field <some String fields>
): Observable<Response<TestListing>>
包装在仓库中
override fun test(<some String fields>): Observable<Response<TestListing>> {
return api.test(<some String fields>)
.subscribeOn(schedulers.io())
}
型号:
data class TestListing (
@Json(name = "success") val success:Int,@Json(name = "user") val user: TestUser?
)
TestUser 类
data class TestUser(
@Json(name = "id") val id: Int,@Json(name = "email") val email: String,@Json(name = "name") val name: String,@Json(name = "key") val remix_userkey: String,@Json(name = "downloads_limit") val downloads_limit: Int?,<some other fields>
)
fun test(<some String fields>){
compositedisposable.add(testRepo.test(<some String variables>)
.subscribeOn(schedulers.io())
.observeOn(schedulers.main())
.subscribe ({ testList ->
testListDebug.postValue(testList)
if (testList.isSuccessful) user.postValue(userList.body()?.user)
else {<some error posting>}
})
{ throwable -> <some actions>})
}
所以没有 minifyEnabled 它会解析这个 JSON
{"success":1,"user":{"id":"123456","email":"test@test.com","name":"Test","remix_userkey":"abcd123abcd","downloads_limit":15}}
正确的是,在我启用 minify 后 - id 字段始终为 0。
相同的 JSON,但不知何故它包装在改造响应中,主体中已经有 id=0(所有其他字段都被正确解析)
API 调用后来自调试器的 testListDebug 值示例
尝试在 proguard-rules.pro 文件中添加所有库规则,但没有效果;还尝试将 @Keep 注释添加到 TestUser 类并重命名 id 字段
我可以从哪里挖掘?是关于 moshi 还是 Retrofit/Okhttp?
解决方法
想通了 - 需要保留一个自定义的 moshi 注释类,该类用于解析其他 API 调用中的某些字段(有时是 Int 有时是 Boolean),这里没有使用。向其添加保持注释后,id 解析良好
非常奇怪的行为,因为这里没有使用这个注释