Я пытаюсь создать класс данных для объекта, который должен быть структурирован следующим образом:
data class Foo<T>() {
val type: String
val body: T
}
Тип тела будет зависеть от значения type
и будет одним из набора предопределенных, простых в управлении классов данных (ThisBody
, ThatBody
и т. Д.).
Я пишу Gson TypeAdapter для чтения сервера json.
Когда reader.nextName() == "body"
возможно захватить весь объект и обработать его следующим образом:
Gson().fromJson<ThisBody>(bodyObject, ThisBody::class.java)
или мне просто нужно смириться и выписать все это?
Ясно, что на читателе нет метода nextObject()
, но мне было интересно, есть ли какой-нибудь хитрый способ получить объект и сделать, как описано выше.
Пока что мой план атаки выглядит так:
@Throws(IOException::class)
override fun read(reader: JsonReader?): Foo? {
reader?.let {
...
var foo = Foo()
while (it.hasNext()) {
when (it.peek()) {
JsonToken.BEGIN_OBJECT -> it.beginObject()
JsonToken.NAME -> {
when (it.nextName()) {
TYPE -> {
foo.type = it.nextString()
}
BODY -> {
//Any way to do this?
Gson().fromJson<ThisBody>(it.nextObject, ThisBody::class.java)
}
else -> it.skipValue()
}
}
JsonToken.END_OBJECT -> it.endObject()
}
}
return foo
}