繁体   English   中英

带改造的 Moshi 发送空请求

[英]Moshi with Retrofit send empty request

我的应用程序每次都会发送我的位置。 当我禁用地理定位时。 我想发送 {"latitude":null,"longitude":null} 但发送了 {}

模型

@Serializable
data class PointBody(
    @Json(name = "latitude") val latitude: Double?,
    @Json(name = "longitude") val longitude: Double?
)

要求

 @POST(Path.LOCATION)
    suspend fun sendPoint(
        @Body point: PointBody
    )

改造

private fun provideRetrofit(moshi: Moshi, client: OkHttpClient) = Retrofit.Builder()
    .client(client)
    .addConverterFactory(MoshiConverterFactory.create(moshi))
    .baseUrl("Base")
    .build()

莫希

private fun provideMoshi(): Moshi {
    return Moshi
        .Builder()
        .add(KotlinJsonAdapterFactory())
        .build()
}

我的解决方案

工厂

@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class SerializeNulls

class SerializeNullsFactory : JsonAdapter.Factory {
    override fun create(type: Type, annotations: Set<Annotation?>, moshi: Moshi): JsonAdapter<*>? {
        val nextAnnotations = Types.nextAnnotations(
            annotations,
            SerializeNulls::class.java
        ) ?: return null
        return moshi.nextAdapter<Any>(this, type, nextAnnotations).serializeNulls()
    }
}

模型

@Serializable
data class PointBody(
    @SerializeNulls val latitude: Double?,
    @SerializeNulls val longitude: Double?
)

莫希

private fun provideMoshi(): Moshi {
    return Moshi
        .Builder()
        .add(SerializeNullsFactory())
        .add(KotlinJsonAdapterFactory())
        .build()
}

您只需将withNullSerialization()函数添加到MoshiConverterFactory即可解决。

    @Singleton
    @Provides
    fun provideMoshi(): Moshi =
        Moshi.Builder()
            .add(KotlinJsonAdapterFactory())
            .build()
    
    @Singleton
    @Provides
    fun provideMoshiConverterFactory(moshi: Moshi): MoshiConverterFactory =
        MoshiConverterFactory.create(moshi).withNullSerialization()

来自MoshiConverterFactory.java代码

...
  /** Return a new factory which includes null values into the serialized JSON. */
  public MoshiConverterFactory withNullSerialization() {
    return new MoshiConverterFactory(moshi, lenient, failOnUnknown, true);
  }
...

请查看MoshiConverterFactory.java以获取更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM