【问题标题】:Ktor - create List from Json fileKtor - 从 Json 文件创建列表
【发布时间】:2021-10-16 00:01:13
【问题描述】:

我收到错误 - 此类在 object : TypeToken<List<Todo>>() 处没有构造函数 + 对象不是抽象的,也没有实现对象成员

data class Todo(
    val identifier: Long ,
    val name: String ,
    val description: String
)


class DefaultData {

private lateinit var myService: MyService

@PostConstruct
fun initializeDefault() {
    val fileContent = this::class.java.classLoader.getResource("example.json").readText()

    val todos: List<Todo> = Gson().fromJson(fileContent, object : TypeToken<List<Todo>>() {}.type)

    myService.createTodoFromJsontodos
}

}

我该如何解决这个问题?

目标是:能够创建一个可以通过服务从json文件中获取数据的端点

有没有完整的例子

另外如何在 Ktor 中创建接口?因为我想使用依赖倒置来实现从不同来源检索数据

【问题讨论】:

  • 您使用的是哪个版本的 Gson?
  • 实现(“com.google.code.gson:gson:2.8.7”)
  • 请分享Ktor相关代码。您可以使用 Koin insert-koin.io/docs/reference/koin-ktor/ktor 在 Ktor 应用程序中进行依赖注入。
  • 嗨,它只是一个入门项目。我有一个“有趣的 Routing.myRoutes....”,并且尚未编写服务,因为我将代码从服务移至 DefaultData。所以没什么好分享的,找个例子

标签: kotlin ktor


【解决方案1】:

您可以轻松利用 kotlinx 序列化。

步骤:

  1. 在 build.gradle 文件中添加 kotlin 序列化插件

kotlin("plugin.serialization") version "1.5.20"

plugins {
    application
    java
    id("org.jetbrains.kotlin.jvm") version "1.5.21"
    kotlin("plugin.serialization") version "1.5.20"
}
  1. 为序列化库添加依赖
dependencies {
     ...
     implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.2")
}
  1. 使用Json解码方法将你的json字符串解码为对应的对象
val JSON = Json {isLenient = true}
val mytodos = JSON.decodeFromString(message) as List<Todo>

【讨论】:

    【解决方案2】:

    Kotlin 有类似TypeToken 的内置工具,所以我建议改用它:

    Gson().fromJson(fileContent, typeOf<List<Todo>>().javaType)
    

    您需要将依赖项添加到kotlin-reflecttypeOf() 函数被标记为实验性的,但我已经使用了一段时间并且从未遇到任何问题。

    另外,您在评论中说这是一个入门项目。如果您还没有任何现有代码,那么我建议使用kotlinx-serialization 而不是Gson。它是 Kotlin 中的事实标准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 2021-07-13
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      相关资源
      最近更新 更多