首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Enum解析在moshi和R8中失败

Enum解析在moshi和R8中失败
EN

Stack Overflow用户
提问于 2020-09-25 16:39:23
回答 1查看 3K关注 0票数 4

我有以下依赖关系:

moshi-码原: 1.10.0

kotlin: 1.4.10

Android Gradle插件: 4.0.1

在构建中启用了R8。

在运行时,当Moshi尝试解析枚举时,我得到了以下堆栈跟踪

代码语言:javascript
复制
java.lang.AssertionError: Missing field in e.f.a.k.c.b.a
        at com.squareup.moshi.StandardJsonAdapters$EnumJsonAdapter.<init>(SourceFile:246)
        at com.squareup.moshi.StandardJsonAdapters$1.create(SourceFile:67)
        at com.squareup.moshi.Moshi.adapter(SourceFile:141)
        at com.tsystems.tpay.data.client.models.ContactApiModelJsonAdapter.<init>(SourceFile:30)
        at java.lang.reflect.Constructor.newInstance0(Native Method)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
        at com.squareup.moshi.internal.Util.generatedAdapter(SourceFile:553)
        at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory.create(SourceFile:193)
        at com.squareup.moshi.Moshi.adapter(SourceFile:141)
        at com.squareup.moshi.Moshi.adapter(SourceFile:101)
        at com.squareup.moshi.Moshi.adapter(SourceFile:71)
        at com.squareup.moshi.CollectionJsonAdapter.newArrayListAdapter(SourceFile:52)
        at com.squareup.moshi.CollectionJsonAdapter$1.create(SourceFile:36)
        at com.squareup.moshi.Moshi.adapter(SourceFile:141)
        at com.squareup.moshi.Moshi.adapter(SourceFile:101)
        at p.z.a.a.a(SourceFile:91)
        at p.u.a(SourceFile:352)
        at p.u.b(SourceFile:335)
        at p.k.a(SourceFile:113)
        at p.k.a(SourceFile:82)
        at p.v.a(SourceFile:37)
        at p.u.a(SourceFile:192)
        at p.u$a.invoke(SourceFile:149)
        at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
        at $Proxy14.c(Unknown Source)
        at e.f.a.k.b.f$g.a(SourceFile:87)
        at i.b0.j.a.a.b(SourceFile:33)
        at j.a.v0.run(SourceFile:241)
        at j.a.g3.a.a(SourceFile:594)
        at j.a.g3.a.a(SourceFile:60)
        at j.a.g3.a$b.run(SourceFile:740)
     Caused by: java.lang.NoSuchFieldException: PERSONAL
        at java.lang.Class.getField(Class.java:1604)
        at com.squareup.moshi.StandardJsonAdapters$EnumJsonAdapter.<init>(SourceFile:240)

根据自述文件,我不需要手动添加R8规则,但是枚举可能是例外吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-27 06:08:09

是的,枚举应该被处理得有点不同,并且目前有一个正在等待的PR来更新自述文件(在编写本文时) https://github.com/square/moshi/pull/1216

你有两个选择:

  1. 在枚举定义的基础上添加@JsonClass(generateAdapter = false)
  2. 添加一个保护规则来保持您的枚举字段,例如,
代码语言:javascript
复制
-keepclassmembers enum your.model.package.YourEnum {
    <fields>;
    **[] values();
}

原因:

根据这里的代码https://github.com/square/moshi/blob/0c85eae34af00ecbee46beaa5b25fb4af00fb9f2/moshi/src/main/resources/META-INF/proguard/moshi.pro#L10,Enum字段名被集成的EnumJsonAdapter使用。values()由Kotlin编译器合成,EnumJsonAdapter间接使用。

还请注意,在同一个文件中,Moshi已经生成了一个预先制定的保护规则,该规则由您的应用程序继承:

代码语言:javascript
复制
-keepclassmembers @com.squareup.moshi.JsonClass class * extends java.lang.Enum {
    <fields>;
    **[] values();
}

这个规则基本上适用于由@JsonClass注释注释的所有类,因此如果您添加注释(Option#1),那么这个规则将涵盖您的类。

或者,如果不想添加注释,可以为类(又名Option#2 )添加规则。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64068151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档