Класс платформы java.util.Collections$SingletonMap (без аннотаций) требует регистрации явного JsonAdapter
Я должен создать и передать Моши пользовательский JsonAdapter для java.util.Collections$SingletonMap
типа, если я получаю сообщение об ошибке правильно. Проблема в том, что SingletonMap является частным в "Коллекциях".
val movies: MutableList<Movie> = Collections.synchronizedList(mutableListOf(
Movie("Home alone"),
Movie("Terminator"),
Movie("Independence day")
))
// and later
get("/movies") {
call.respond(mapOf("movies" to synchronized(movies) { movies.toList() }))
}
Вот mapOf()
возвращается Map<String, List<Movie>>
и при поддержке java.util.Collections.singletonMap(K key, V value)
который возвращает SingletonMap.
Моя попытка реализовать JsonAdapter для карты. Не помогло хотя
class MapJsonAdapter(
private val elementAdapter: JsonAdapter<Any?>
) : JsonAdapter<Map<Any, Any?>>() {
object Factory : JsonAdapter.Factory {
override fun create(type: Type, annotations: Set<Annotation>,
moshi: Moshi
): JsonAdapter<*>? {
if (annotations.isNotEmpty()) return null
val rawType = Types.getRawType(type)
if (rawType != Map::class.java) return null
val elementType = (type as ParameterizedType).actualTypeArguments[0]
return MapJsonAdapter(moshi.adapter(elementType))
}
}
override fun fromJson(reader: JsonReader): Map<Any, Any?> {
throw UnsupportedOperationException()
}
override fun toJson(writer: JsonWriter, value: Map<Any, Any?>?) {
checkNotNull(value, { "Adapter doesn't support null. Wrap with nullSafe()." }).apply {
writer.beginObject()
value.forEach { t, u ->
elementAdapter.toJson(writer, t)
elementAdapter.toJson(writer, u)
}
writer.endObject()
}
}
}
// Usage in ktor
//...
install(ContentNegotiation) {
moshi {
add(MapJsonAdapter.Factory)
}
}
Есть ли способ преодолеть проблему?