Мне нужно определить JsonAdapter
для BigDecimal
с помощью аннотации JsonQualifier
и использовать его для элементов списка.
@JsonQualifier
@Target(AnnotationTarget.TYPE)
@Retention(AnnotationRetention.RUNTIME)
annotation class JsonCoordinates
@JsonClass(generateAdapter = true)
data class LocationData(
val coordinates: List<@JvmSuppressWildcards @JsonCoordinates BigDecimal>
)
class LocationDataAdapterTest {
@Test
fun toJsonWithQualifier() {
val moshi: Moshi
val adapter: JsonAdapter<LocationData>
moshi = Moshi.Builder()
.add(BigDecimal::class.java, JsonCoordinates::class.java,
DecimalAdapter())
.build()
adapter = moshi.adapter(LocationData::class.java)
val data = LocationData(listOf(BigDecimal(10), BigDecimal(20)))
assertEquals("{\"coordinates\":[\"10\",\"20\"]}", adapter.toJson(data))
}
@Test
fun toJsonWithoutQualifier() {
val moshi: Moshi
val adapter: JsonAdapter<LocationData>
moshi = Moshi.Builder()
.add(BigDecimal::class.java, DecimalAdapter())
.build()
adapter = moshi.adapter(LocationData::class.java)
val data = LocationData(listOf(BigDecimal(10), BigDecimal(20)))
assertEquals("{\"coordinates\":[\"10\",\"20\"]}", adapter.toJson(data))
}
}
Тест toJsonWithoutQualifier
имеет успехТест toJsonWithQualifier
не пройден со следующим исключением:
java.lang.IllegalArgumentException: Platform class java.math.BigDecimal (with no annotations) requires explicit JsonAdapter to be registered
for class java.math.BigDecimal
for java.util.List<java.math.BigDecimal> coordinates
for class app.klosed.api.model.LocationData
Вот полный код https://gist.github.com/dscoppelletti/a5937124e1b33e5e33771b7845b2ed9a