首页 > 解决方案 > 使用 EnumJsonAdapter 解析枚举不起作用

问题描述

我有一个数据类 User :

 @JsonClass(generateAdapter = true)
data class User(val accountName: String,
                val gender: Gender,
                val title: Title? = null)
)

其中 gender 和 title 必须只有一些值,这些值写在 enums 中:

enum class Gender(val value: Int) {
  MALE(0), FEMALE(1), UNSPECIFIED(-1)
}

enum class Title(val value: String) {
  MRS("Mrs"), MS("Ms")
}

我添加EnumJsonAdapter到moshi builder,但它不起作用。

fun fromJson(json: String): User? {
      val builder = Moshi.Builder()
          .add(Title::class.java, EnumJsonAdapter.create<Title>(Title::class.java).withUnknownFallback(null))
          .add(Gender::class.java, EnumJsonAdapter.create<Gender>(Gender::class.java).withUnknownFallback(Gender.UNSPECIFIED))
          .build()
      val jsonAdapter = builder.adapter(User::class.java)

      return jsonAdapter.fromJson(json)
    }

    fun toJson(obj: User): String {
      val builder = Moshi.Builder()
          .add(Title::class.java, EnumJsonAdapter.create<Title>(Title::class.java).withUnknownFallback(null))
          .add(Gender::class.java, EnumJsonAdapter.create<Gender>(Gender::class.java).withUnknownFallback(Gender.UNSPECIFIED))
          .build()
      val jsonAdapter = builder.adapter(User::class.java).serializeNulls()

      return jsonAdapter.toJson(obj)
    }

我收到 title = "Mr" 并将其解析为 null。关于性别,我得到了这个例外:

com.squareup.moshi.JsonDataException: Expected a string but was NUMBER at path $.data.gender
        at com.squareup.moshi.adapters.EnumJsonAdapter.fromJson(EnumJsonAdapter.java:93)

这是我做错了EnumJsonAdapter什么吗?所以我所看到的,它不能用于 int,但是为什么它不能用于作为 String 的 title 呢?

如果我为这些枚举使用自定义适配器,一切正常。

标签: jsonkotlinenumsadaptermoshi

解决方案


推荐阅读