【问题标题】:Gson ignores custom @SerializedName values for enum on serializationGson 在序列化时忽略枚举的自定义 @SerializedName 值
【发布时间】:2019-05-03 19:43:12
【问题描述】:

我有这样的枚举:

enum class NewTaskState(val value: Int) {

    @SerializedName("0")
    STATE_INSTALLED(0),

    @SerializedName("1")
    STATE_LAUNCHED(1)

}

经过改造的 API 调用:

 @POST("tasks/android/{id}/state/update/")
 @FormUrlEncoded
 fun updateAppTaskState(
     @Path("id") id: Long,
     @Query("device_pk") deviceId: Long,
     @Field("new_state") newState: NewTaskState
 ): Single<Response<Any>>

和GSON配置:

return GsonBuilder()
    .registerTypeAdapter(Date::class.java, DateDeserializer())
    .enableComplexMapKeySerialization()
    .create()

Gson 版本为2.8.5

当我使用这个调用时,我在日志中看到:

I/OkHttp: --> POST <removed>/tasks/android/1/state/update/?device_pk=8
I/OkHttp: Content-Type: application/x-www-form-urlencoded
I/OkHttp: Content-Length: 25
I/OkHttp: Authorization: Token <removed>
I/OkHttp: new_state=STATE_INSTALLED

因此它在 序列化 上忽略 @SerializedName 值,但在 反序列化 上工作正常。

怎么了?

【问题讨论】:

    标签: android kotlin gson retrofit2


    【解决方案1】:

    发生这种情况是因为Gson 不参与 url 格式编码。

    来自@Field的javadoc:

    使用Retrofit.stringConverter(Type, Annotation[])(或Object.toString(),如果未安装匹配的字符串转换器)将值转换为字符串,然后形成 URL 编码。 null 值被忽略。传递List 或数组将为每个非null 项生成一个字段对。

    并且GsonConverterFactory 不会覆盖Converter.Factory#stringConverter,因此它不会忽略任何内容。它只是没有开始


    作为一种解决方法,您可以执行类似的操作:

    Converter

    object EnumAsOrdinalToStringConverter : Converter<Enum<*>, String> {
        override fun convert(value: Enum<*>): String =
                value.ordinal.toString()
    }
    

    Factory

    class EnumAsOrdinalToStringConverterFactory : Converter.Factory() {
        override fun stringConverter(
                type: Type,
                annotations: Array<Annotation>,
                retrofit: Retrofit
        ): Converter<*, String>? = if (type is Class<*> && type.isEnum) {
            EnumAsOrdinalToStringConverter
        } else {
            null
        }
    }
    

    大楼Retrofit

    addConverterFactory(EnumAsOrdinalToStringConverterFactory())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-10-21
      相关资源
      最近更新 更多