我正在使用Jackson-Kotlin在我的kotlin项目中序列化和反序列化JSON对象。问题是我必须在每个类中定义相同的方法,而只更改一个typeValue。这似乎是非常糟糕的做法,因此我将向社区介绍解决这种情况的最佳方法。
示例:
class User: Model() {
//...
companion object {
fun fromJson(json: String): User {
return ObjectMapper().registerKotlinModule().readValue<User>(json)
}
fun toJson(user: User): String {
return ObjectMapper().registerKotlinModule().writeValueAsString(user)
}
}
}
class Friend: Model() {
//...
companion object {
fun fromJson(json: String): User {
return ObjectMapper().registerKotlinModule().readValue<Friend>(json)
}
fun toJson(friend: Friend): String {
return ObjectMapper().registerKotlinModule().writeValueAsString(user)
}
}
}
如您所见,除了readValue<>()
方法上的type参数之外,代码非常相似。有没有办法我可以在Model()类中定义一个方法,而不是在从Model继承的每个类上定义一个方法?
答案 0 :(得分:1)
您似乎可以在这里雇用generics。
伴侣对象没有类的类型参数的概念,因为它们不是类的实例,因此您可以使函数的实例方法被继承:
-x imports
或让函数本身接受类型参数:
class Model<T> {
fun fromJson(json: String): User {
return ObjectMapper().registerKotlinModule().readValue<T>(json)
}
fun toJson(friend: T): String {
return ObjectMapper().registerKotlinModule().writeValueAsString(friend)
}
}
答案 1 :(得分:0)
You don't want to create an ObjectMapper
and register a module each time.
class Model {
companion object {
// could be public if you want to do anything else with it
private val objectMapper = ObjectMapper().registerKotlinModule()
inline fun <reified T : Model> fromJson(json: String): User {
return objectMapper.readValue<T>(json)
}
fun toJson(value: Model): String {
return objectMapper.writeValueAsString(value)
}
}
}
使用:
val friend = Model.fromJson<Friend>(...)
,或者只有Model.fromJson(...)
(如果有预期的类型)。
也来自同一页面:
输入:如果有字节[],则最好。 InputStream次之;其次是Reader -在任何情况下,请不要尝试将输入读取为字符串!
输出:OutputStream最佳;作家第二名;并调用writeValueAsString()效率最低(为什么构造中间String?)