javaandroidkotlinretrofitmosh

Moshi with Retrofit send empty request


My app send my location every time. when I disable geolocation. i want send {"latitude":null,"longitude":null} but sent {}

Model

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

Request

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

Retorift

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

Moshi

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

Solution

  • You can solve just adding withNullSerialization() function to MoshiConverterFactory.

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

    Code From MoshiConverterFactory.java

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

    Please check MoshiConverterFactory.java for further information.