Класс Kotlin для соответствия JSON и Nested Object для компоновщика GSON - PullRequest
0 голосов
/ 21 января 2019

У меня есть некоторый входящий JSON, который выглядит следующим образом.

 {  "status":200,
    "transformation_percent":0.0,
    "image_percent":24.51,
    "bandwidth_percent":0.0,
    "storage_percent":26.23,
    "freeTrialPeriod":7889238000,
    "freeTrialParams":"{\"cache_period\":604800000,\"cache_allowance\":5000,\"price_in_cents\":0}",
    "basicPlanParams":"{\"cache_period\":604800000,\"cache_allowance\":10000,\"stripe_plan_id\":\"plan_blah\",\"price_in_cents\":100,\"currency\":\"eur\"}"
}

Я пытаюсь создать класс ServerParams Kotlin, который будет соответствовать этому входящему JSON, чтобы я мог передать этот класс в gsonBuilder следующим образом:

val GSON = GsonBuilder().setLenient().create()
val server_params = GSON.fromJson(string, ServerParams::class.java)

Я борюсь с вложенными объектами.Я знаю, как написать свой собственный десериализатор, так что я могу сделать это, если придется, но Котлин за короткое время оказался настолько элегантным языком, что я подумал, что должен быть лучший способ сделать это.Я также не хочу писать соответствующие десериализаторы для каждого вызова API!

Я пробовал внутренние классы, которые не работали.Я попытался создать дополнительные классы для вложенных объектов в строке JSON, но это тоже не сработало.

1 Ответ

0 голосов
/ 21 января 2019

Вот минимальный пример того, как вы это сделаете:

class OuterClass(val name: String) {
    var inner = InnerClass(2)
}

class InnerClass(val number: Int)

fun main() {
    val gson = GsonBuilder().setLenient().create()
    val outerClass  = gson.fromJson("""{
        name: 'test',
        inner: {
            number : 1
        }
    }""".trimMargin(), OuterClass::class.java)
}

Вы просто помещаете экземпляр внутреннего класса в свойство внешнего класса.

Поскольку Gson изменяет классы с помощью отражения, вы также можете объявить внутренний класс как lateninit, что сделает ненужным создание экземпляра внутреннего класса со значением по умолчанию.

class OuterClass(val name: String) {
    lateinit var inner: InnerClass
}

Это, конечно, имеет смысл, только если вы устанавливаете класс через Gson.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...