在 Quarkus 的 JSON 响应中包含 class 名称(Kotlin 数据 class)

Include class name (Kotlin data class) in JSON response in Quarkus

我是 Quarkus 和 Kotlin 的新手,说实话,我不太确定幕后发生了什么,哪个 JSON 库实际上负责渲染 JSON当我在我的函数上设置 @Produces(MediaType.APPLICATION_JSON) 时来自资源的响应。但是我返回了一个数据 class 的实例,它是我从该方法创建的,并且该数据 class 中的所有字段都在响应中呈现。但是,我有多个响应 classes,我想在 JSON 响应中包含 class 的名称。我现在拥有的是一个字符串字段,它只是硬编码为 class 的名称,但这很难看,因为我必须重复 class 名称:

data class StuffInitiatedResponse (
    val id: String,
    val projectId: String
) {
    val operation = "StuffInitiatedResponse"
}

data class StuffCompletedResponse (
    val id: String,
    val projectId: String,
) {
    val operation = "StuffCompletedResponse"
}

并为我服务 class:

@Path("/myservice")
class MyService {

    @POST
    @Path("{project}/{path:.*}")
    @Produces(MediaType.APPLICATION_JSON)
    fun initiateStuff(@PathParam project: String,
                      @PathParam path: String,
                      @QueryParam("completedId") completedId: String?) : StuffInitiatedResponse {
        
        if (completedId == null) {
            println("I've initiated stuff")
            return StuffInitiatedResponse(UUID.randomUUID().toString(), project)
        } else {
            println("I've completed stuff")
            return StuffCompletedResponse(completedId, project)
        }
    }
}

这产生了我所期望的,但正如我所说,我很恼火,因为我必须在数据 classes 的“响应”字段中重复 class 名称。有什么方法可以让我在 JSON 中嵌入 class 名称?

JSON 库取决于您定义的依赖项。可以是Jackson也可以是Yasson

我建议使用 Jackson,在这种情况下,您可以在序列化 类 上使用 @JsonTypeInfo 注释,它有一些选项可以在 JSON 输出中包含类型.