【问题标题】:How to fallback on a enum if values don't match in OpenAPI generator's Moshi如果 OpenAPI 生成器的 Moshi 中的值不匹配,如何回退枚举
【发布时间】:2020-02-05 07:45:06
【问题描述】:

我有一个枚举类,如果值与其中任何一个都不匹配,我希望它回退为 null。

我正在使用 openapi-generator-cli 3.3.0

例如 1. 生成类

object Serializer {
    @JvmStatic
    val moshi: Moshi = Moshi.Builder()
            .add(KotlinJsonAdapterFactory())
            .add(Unit.javaClass, UnitJsonAdapter())
            .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
            .build()
}

data class GetProfileResponse (
    @Json(name = "gender") val gender: Gender?
)

enum class Gender(val value: kotlin.String){
    @Json(name = "male") male("male"),
    @Json(name = "female") female("female");
}

class Api() : ApiClient() {
  fun getProfileResponse() : GetProfileResponse {
        val localVariableBody: kotlin.Any? = null
        val localVariableQuery: MultiValueMap = mapOf()

        val contentHeaders: kotlin.collections.Map<kotlin.String,kotlin.String> = mapOf()
        val acceptsHeaders: kotlin.collections.Map<kotlin.String,kotlin.String> = mapOf("Accept" to "application/json")
        val localVariableHeaders: kotlin.collections.MutableMap<kotlin.String,kotlin.String> = mutableMapOf()
        localVariableHeaders.putAll(contentHeaders)
        localVariableHeaders.putAll(acceptsHeaders)

        val localVariableConfig = RequestConfig(
            RequestMethod.GET,
            "/profile",
            query = localVariableQuery,
            headers = localVariableHeaders
        )
        val response = request<GetProfileResponse>(
            localVariableConfig,
            localVariableBody
        )  // call okhttp & moshi (e.g. Serializer.moshi.adapter(T::class.java).fromJson(body.source())) in request()

        return when (response.responseType) {
            ResponseType.Success -> (response as Success<*>).data as GetProfileResponse
            ResponseType.Informational -> TODO()
            ResponseType.Redirection -> TODO()
            ResponseType.ClientError -> throw ClientException((response as ClientError<*>))
            ResponseType.ServerError -> throw ServerException((response as ServerError<*>))
            else -> throw kotlin.IllegalStateException("Undefined ResponseType.")
        }
  }
}
  1. API 响应
{
  "gender": "OtherGender"
}

运行此代码会导致以下异常: com.squareup.moshi.JsonDataException: 预期 ~~ 但在路径中是“OtherGender” ~~

但我想将性别 = null。我该怎么做?

【问题讨论】:

    标签: android kotlin moshi openapi-generator


    【解决方案1】:
    class NullableEnumAdapter<T:Enum<T>> : JsonAdapter<T> {
      @FromJson fun fromJson(jsonReader: JsonReader, delegate: JsonAdapter<T>): T? {
        val value = jsonReader.nextString()
        return try {
          delegate.fromJsonValue(value)
        } catch (e: Exception) {
         null
       }
      }
    }
    
    object Serializer {
        @JvmStatic
        val moshi: Moshi = Moshi.Builder()
                .add(KotlinJsonAdapterFactory())
                .add(Unit.javaClass, UnitJsonAdapter())
                .add(Date::class.java, Rfc3339DateJsonAdapter().nullSafe())
                .add(Gender::class.java, NullableEnumAdapter<Gender>())
                .build()
    }
    

    【讨论】:

    • add(final Type type, final JsonAdapter&lt;T&gt; jsonAdapter): add 方法需要 JsonAdapter,但 NullableEnumAdapter 不是 JsonAdapter。此代码无效。
    猜你喜欢
    • 2019-06-04
    • 2020-05-30
    • 2018-09-15
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2021-04-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多