如何在 Kotlin 对象中动态添加键值对?
How to dynamically add key value pairs in Kotlin object?
我有 Spring Boot REST api returns JSON 这样的对象 -
{
"id": "1"
"timestamp": "2020-08-03T08:49:02.679+00:00"
"message": "hello"
}
这是直接从@Entity
导出来的-
fun getMessage(id: Long) = messageRepository.findById(id)
这里,Spring 开机自动将响应转换为JSON。但是,我想在 getMessage()
函数中添加另一个键值对。与此类似 - How can I add a key/value pair to a JavaScript object? 但在 Java/ Kotlin.
我该怎么做?
也许您可以为此创建另一个模型并创建一个扩展以转换为新模型。
data class Message(
val id: Int,
val timestamp: String,
val message: String
)
data class MessageWithMoreInfo(
val id: Int,
val timestamp: String,
val message: String,
val info: String
)
fun Message.toMessageWithMoreInfo(val info: String) = MessageWithMoreInfo(
id,
timestamp,
message,
info
)
您将无法复制 javascript 将键和值注入对象的方式,因为 Java(和 Kotlin)是一种静态类型语言。
Spring 到 Json 的转换并不神奇。它很可能会使用对象映射器(Jackson 或 Gson)序列化您的实体。
现在,您可以通过多种方式解决此限制(有些方式比其他方式更好),Luciano 的回答是最好的方式之一。
但是,根据您注入实体的内容以及项目设计的定义方式,您可以通过使用 spring 上下文提供的对象映射器和将您的实体转换为 Map:
@Service
class AServiceImpl(
private val repository: ARepository,
// autowires the objectMapper
private val objectMapper: ObjectMapper
) : AService {
override fun getMessage(id: Long): Map<String, Any>{
val entity = repository.findById(id)
// here you have something more like a javascript Object
val map: MutableMap<String, Any> = objectMapper.convertValue(entity)
// so you can add key/value pairs to it
map["something"] = "some_value"
// but you will need to change the method signature
return map
}
}
记住:传递地图有点危险,你会失去很多 Java/Kotlin 带来的好处:)
我有 Spring Boot REST api returns JSON 这样的对象 -
{
"id": "1"
"timestamp": "2020-08-03T08:49:02.679+00:00"
"message": "hello"
}
这是直接从@Entity
导出来的-
fun getMessage(id: Long) = messageRepository.findById(id)
这里,Spring 开机自动将响应转换为JSON。但是,我想在 getMessage()
函数中添加另一个键值对。与此类似 - How can I add a key/value pair to a JavaScript object? 但在 Java/ Kotlin.
我该怎么做?
也许您可以为此创建另一个模型并创建一个扩展以转换为新模型。
data class Message(
val id: Int,
val timestamp: String,
val message: String
)
data class MessageWithMoreInfo(
val id: Int,
val timestamp: String,
val message: String,
val info: String
)
fun Message.toMessageWithMoreInfo(val info: String) = MessageWithMoreInfo(
id,
timestamp,
message,
info
)
您将无法复制 javascript 将键和值注入对象的方式,因为 Java(和 Kotlin)是一种静态类型语言。
Spring 到 Json 的转换并不神奇。它很可能会使用对象映射器(Jackson 或 Gson)序列化您的实体。
现在,您可以通过多种方式解决此限制(有些方式比其他方式更好),Luciano 的回答是最好的方式之一。
但是,根据您注入实体的内容以及项目设计的定义方式,您可以通过使用 spring 上下文提供的对象映射器和将您的实体转换为 Map
@Service
class AServiceImpl(
private val repository: ARepository,
// autowires the objectMapper
private val objectMapper: ObjectMapper
) : AService {
override fun getMessage(id: Long): Map<String, Any>{
val entity = repository.findById(id)
// here you have something more like a javascript Object
val map: MutableMap<String, Any> = objectMapper.convertValue(entity)
// so you can add key/value pairs to it
map["something"] = "some_value"
// but you will need to change the method signature
return map
}
}
记住:传递地图有点危险,你会失去很多 Java/Kotlin 带来的好处:)