Bur*_*urg 3 java json jackson kotlin
我在 Kotlin 中定义了一个类/接口对,如下所示:
@JsonDeserialize(`as` = SimpleEvent::class)
interface Event {
val organizationId: UUID
val userId: UUID
val eventTime: LocalDateTime
val eventId: UUID
@get:JsonAnyGetter
@get:JsonAnySetter
val details: Map<String, JsonNode>
}
data class SimpleEvent(
override val organizationId: UUID,
override val userId: UUID,
override val eventTime: LocalDateTime,
override val eventId: UUID,
override val details: Map<String, JsonNode>
) : Event
Run Code Online (Sandbox Code Playgroud)
我的目标是将 json 文档中的任何额外字段转换为地图中的条目details
。和注释很有希望,但我找不到一种方法来使用不可@JsonAnyGetter
变的构造函数参数。 按预期工作,但似乎被忽略。@JsonAnySetter
@JsonAnySetter
@JsonAnyGetter
@JsonAndSetter
小智 5
我有一个类似的问题,这对我有用:
data class MyDataClass(
val field1: Int,
val field2: String,
@JsonAnySetter
@get:JsonAnyGetter
val otherFields: Map<String, Any> = hashMapOf()
)
Run Code Online (Sandbox Code Playgroud)
@JsonAnySetter
告诉 Jackson 使用otherFields
Map 作为反序列化过程中遇到的无法映射到任何显式字段的任何名称-值对的“捕获所有”。
相反,@JsonAnyGetter
告诉 JacksonotherFields
除了类中显式声明的字段之外,这是要序列化的其他字段的来源。
我一开始不明白它的用途get:
,但事实证明它是一个使用站点目标,告诉编译器将JsonAnyGetter
注释应用于从 Kotlin 元素(构造函数参数)生成的 Java getter。如果没有它,编译器会抱怨@JsonAnyGetter
“无法应用于目标值参数”。