Добавление статических методов и методов экземпляра в список в Kotlin
Я пытаюсь добавить поддержку 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 ответ
Ты можешь использовать
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)