如何使用 Jackson 将 json 文档的额外属性反序列化到地图或其他字段中?

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 使用otherFieldsMap 作为反序列化过程中遇到的无法映射到任何显式字段的任何名称-值对的“捕获所有”。

相反,@JsonAnyGetter告诉 JacksonotherFields除了类中显式声明的字段之外,这是要序列化的其他字段的来源。

我一开始不明白它的用途get:,但事实证明它是一个使用站点目标,告诉编译器将JsonAnyGetter注释应用于从 Kotlin 元素(构造函数参数)生成的 Java getter。如果没有它,编译器会抱怨@JsonAnyGetter“无法应用于目标值参数”。