Класс платформы java.util.Collections $ SingletonMap (без аннотаций) требует регистрации явного JsonAdapter - PullRequest
0 голосов
/ 02 декабря 2018

Я должен создать и передать Moshi пользовательский 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 for Map.Не помогло ли

    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)
            }
        }

Есть ли способ решить проблему?

...