Gson JsonReader nextObject ()? - PullRequest
       5

Gson JsonReader nextObject ()?

0 голосов
/ 04 апреля 2019

Я пытаюсь создать класс данных для объекта, который должен быть структурирован следующим образом:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...