7

有没有一种方法和/或库可以像在 Scala Json.Spray 中一样从 Json 自动创建 Kotlin Data 类?

像这样的东西:

data class User(id: Int, name: String)

class DataClassFactory(val json: String) {
   fun getUser(): User {
      //some reflection
      return User(10, "Kirill")
  }
}

fun main(args: Array<String>): Unit {
  val json = "{id: 10, name: Kirill}"
  val usr = DataClassFactory(json).getUser()
  println(usr)
}
4

5 回答 5

5

您可以使用 Kotlin 的 Jackson 模块轻松地从 Jackson 支持的任何格式(包括 JSON)进行序列化/反序列化。这是最简单的方法,并且支持没有注释的 Kotlin 数据类。有关模块,请参阅https://github.com/FasterXML/jackson-module-kotlin,其中包含 Maven 和 Gradle 的最新使用信息(您也可以推断 IVY 并从 Maven 存储库下载 JAR)

存在诸如 Boon 之类的替代方案,但它没有对 Kotlin 的特定支持(通常是没有默认构造函数的问题),并且使用一些不安全的直接访问内部 JVM 类来提高性能。这样做时,它可能会在某些 VM 上崩溃,并且在您使用自定义序列化器/反序列化器从 Kotlin 扩展 Boon 的情况下,它会假设我拥有的 Kotlin 中不正确的类(例如,String 类被包装)看到核心转储。Boon 的速度很快,请注意这些问题并在使用前先进行测试。

(注:我是 Jackson-Kotlin 模块的创建者)

于 2014-10-16T10:34:56.947 回答
4

这在 Kotlin 中非常干净和容易。

import com.fasterxml.jackson.module.kotlin.*

data class User(val id: Int, val name: String)

fun main(args: Array<String>) {
    val mapper = jacksonObjectMapper()
    val json = """{"id": 10, "name": "Kirill"}"""
    val user = mapper.readValue<User>(json)
    println(user)
}

产生这个输出:

User(id=10, name=Kirill)

您只需将其添加到您的 pom.xml

    <dependency>
        <groupId>com.fasterxml.jackson.module</groupId>
        <artifactId>jackson-module-kotlin</artifactId>
        <version>2.6.3-4</version>
    </dependency>
于 2015-12-07T18:23:05.060 回答
1

为什么不使用 Jackson 或任何其他序列化程序?它应该工作..

于 2014-09-07T17:15:28.070 回答
0

怎么样 这是一个将 JSON 字符串转换为 kotlin 数据类的翻译器,它通过插件实现,请参阅下一个 演示用法 https://plugins.jetbrains.com/plugin/9960-jsontokotlinclass

于 2017-09-22T11:03:35.303 回答
0

http://www.json2kotlin.com在线将您的 json 响应转换为 kotlin 数据类,无需安装任何插件。或者,您也可以生成 gson 注释。(披露:我创建了这个实用程序)

于 2017-11-19T08:09:00.307 回答