You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jackson实现特定JSON与Collection<Person>互转:仅用注解可行吗?

可以仅通过Jackson注解实现,无需自定义JsonSerializer/JsonDeserializer

实现步骤:

1. 反序列化(JSON → Collection<Person>)

创建一个包装类,通过@JsonAnySetter注解捕获JSON中的所有键值对,将其转换为Person对象并收集到集合中:

class PersonCollectionDeserializerWrapper {
    val people = mutableListOf<Person>()

    @JsonAnySetter
    fun addPerson(name: String, details: Map<String, Int>) {
        details["age"]?.let { age ->
            people.add(Person(name, age))
        }
    }
}

反序列化时,先将JSON解析为该包装类,再取出people属性即可得到目标集合:

val objectMapper = ObjectMapper().registerModule(KotlinModule())
val wrapper = objectMapper.readValue(jsonString, PersonCollectionDeserializerWrapper::class.java)
val personCollection: Collection<Person> = wrapper.people

2. 序列化(Collection<Person> → 原格式JSON)

创建序列化用的包装类,通过@JsonAnyGetter注解将集合转换为符合原格式的键值对结构:

class PersonCollectionSerializerWrapper(val people: Collection<Person>) {
    @JsonAnyGetter
    fun toJsonMap(): Map<String, Map<String, Int>> {
        return people.associate { person ->
            person.name to mapOf("age" to person.age)
        }
    }
}

序列化时,将Collection<Person>包装进该类,即可生成原格式的JSON:

val wrapper = PersonCollectionSerializerWrapper(personCollection)
val jsonString = objectMapper.writeValueAsString(wrapper)

说明

通过@JsonAnySetter和@JsonAnyGetter这两个Jackson自带注解,无需编写自定义的序列化/反序列化器,就能完成JSON格式与Collection<Person>之间的双向转换。前者用于动态捕获JSON中的未知键值对并转换为目标对象,后者用于动态生成符合原格式的键值对JSON结构。

内容的提问来源于stack exchange,提问作者hertzsprung

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 08:42:07