0

我正在尝试将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)
    }
}

我现在需要做的是弄清楚如何将fromJsontoJson方法添加到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 中完成我想要的语义吗?

4

1 回答 1

0

您可以使用

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)
于 2018-05-04T22:53:11.920 回答