【发布时间】:2019-08-24 20:02:39
【问题描述】:
我们使用大量具有单个值的值对象。对于(反)序列化,我们使用带有 kotlin 模块的 Jackson。
Kotlin 中的一个示例值对象:
data class MyValueObject(val value: String)
或作为 Java
class MyValueObject {
private String value;
public MyValueObject(String value) { this.value = value; }
public String getValue() { return value; }
}
这些值对象必须被序列化和反序列化,并且应该“仅值”序列化,例如。 "theValue" 而不是 "{"value":"theValue"}"。
我想避免为数十个值对象编写自定义序列化器/反序列化器。
我知道对于序列化@JsonValue可以用来实现上面的。
data class MyValueObject(@JsonValue val value: String)
但 JSON ""theValue""(上述序列化的字符串文字)无法反序列化为 MyValueObject。它会导致以下异常:
com.fasterxml.jackson.databind.exc.MismatchedInputException:
Cannot construct instance of `[...].MyValueObject` (although at least one Creator exists):
no String-argument constructor/factory method to deserialize from String value ('test')
at [Source: (String)""test""; line: 1, column: 1]
这是我使用的单元测试:
@Test
fun testSerialize() {
val objectMapper = ObjectMapper()
.registerModule(Jdk8Module())
.registerModule(KotlinModule())
val test = MyValueObject("test")
val json = objectMapper.writeValueAsString(test)
println(json)
objectMapper.readValue<MyValueObject>(json)
}
是否有一种简单/通用的方法来反序列化这些,例如 @JsonValue 以进行序列化?
P.S.:一种可行的解决方案(感谢@LppEdd)是:
data class MyValueObject (@JsonValue val value: String) {
companion object {
@JvmStatic
@JsonCreator
fun create(value: String) = MyValueObject(value)
}
}
但这非常冗长。在构造函数上注释的@JsonCreator 对我不起作用(请参阅我对@LppEdd 答案的评论)
【问题讨论】:
-
那么“theValue”是一个简单的字符串?
-
是的,它是一个字符串。
-
@MarcvonRenteln 查看答案。 JsonCreator 也适用于每种原始类型(字符串和数字)。
标签: java serialization kotlin jackson deserialization