在 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 输出中包含类型.
我是 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 输出中包含类型.