Я хотел бы сериализовать null только для одного свойства в моем теле JSON, которое отправляется в PUT. Я не хочу сериализовать нуль для любых других типов в объекте. Класс модели такой
@Parcel
class User @ParcelConstructor constructor(var college: College?,
var firstname: String?,
var lastname: String?,
var email: String?,
var active: Boolean = true,
var updatedAt: String?,
var gender: String?,
var picture: String?,
var id: String?,
@field: [CollegeField] var collegeInput: String?,
@field: [CollegeField] var otherCollege: String?,)
Я хочу сериализовать поля CollegeInput и otherCollege, если любое из них имеет значение null. Например
val user = User(firstname = "foo", lastname=null, collegeInput="abcd", otherCollege = null)
Json будет выглядеть примерно так:
{"user":{
"firstname": "foo",
"collegeInput": "abcd",
"otherCollege": null
}}
Если otherCollege имеет значение NULL, фамилия не указывается в объекте, поскольку по умолчанию moshi не сериализует значения NULL, что мне и нужно, но поля квалификаторов должны быть сериализованы с нулевыми значениями
Я пытался использовать
class UserAdapter {
@FromJson
@CollegeField
@Throws(Exception::class)
fun fromJson(reader: JsonReader): String? {
return when (reader.peek()) {
JsonReader.Token.NULL ->
reader.nextNull()
JsonReader.Token.STRING -> reader.nextString()
else -> {
reader.skipValue() // or throw
null
}
}
}
@ToJson
@Throws(IOException::class)
fun toJson(@CollegeField b: String?): String? {
return b
}
@Retention(AnnotationRetention.RUNTIME)
@JsonQualifier
annotation class CollegeField
Я добавил адаптер в moshi, но он никогда не вызывается
@Provides
@Singleton
fun provideMoshi(): Moshi {
return Moshi.Builder()
.add(UserAdapter())
.build()
}
@Provides
@Singleton
fun provideRetrofit(client: OkHttpClient, moshi: Moshi, apiConfig: ApiConfig): Retrofit {
return Retrofit.Builder()
.baseUrl(apiConfig.baseUrl)
.client(client)
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
}