Добавление статических методов и методов экземпляра в список в Kotlin - PullRequest
0 голосов
/ 05 мая 2018

Я пытаюсь добавить поддержку Kotlin к quicktype, чтобы разработчики Kotlin могли легко генерировать типы и код маршалинга в Kotlin из JSON.

Для любого данного примера JSON я хочу сгенерировать тип T со статическим методом T.fromJson и методом экземпляра T.toJson, но я застрял, когда тип верхнего уровня не является объектом. Например, учитывая JSON

[
  { "name": "David" }
]

quicktype sample.json -t People -l kotlin производит:

// To parse the JSON, add this file to your project and do:
//
//   val people = People.fromJson(jsonString)

import com.beust.klaxon.*

private val klaxon =
    Klaxon()

typealias People = List<Person>

data class Person (
    val name: String
) {
    public fun toJson() = klaxon.toJsonString(this as Any)

    companion object {
        public fun fromJson(json: String) = klaxon.parse<Person>(json)
    }
}

Теперь мне нужно выяснить, как добавить методы fromJson и toJson к типу People. Вот моя первая попытка:

open class People {
    public fun toJson() = klaxon.toJsonString(this as Any)

    companion object {
        public fun fromJson(json: String) = klaxon.parseArray<Person>(json)
    }
}

Но я не мог написать open class People, поэтому я удалил псевдоним:

open class List<Person> {
    public fun toJson() = klaxon.toJsonString(this as Any)

    companion object {
        public fun fromJson(json: String) = klaxon.parseArray<Person>(json)
    }
}

Но теперь people.toJson() не компилируется, потому что компилятор не может найти метод.

Могу ли я выполнить семантику, которую я хочу, в Kotlin?

1 Ответ

0 голосов
/ 05 мая 2018

Вы можете использовать

class People : List<Person>()

Однако лично я бы упростил следующие общие функции верхнего уровня:

fun <T> T.toJson() = Klaxon().toJsonString(this as Any)
fun <T> fromJson(json: String) = Klaxon().parse<T>(json)
fun <T> fromJsonArray(json: String) = Klaxon().parseArray<T>(json)
...