微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

启用 R8 缩小后,单个 Int 字段出现 Moshi/改造错误

如何解决启用 R8 缩小后,单个 Int 字段出现 Moshi/改造错误

在启用 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>
    )

最后在 viewmodel 中调用

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 解析良好

非常奇怪的行为,因为这里没有使用这个注释

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。