使用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
相关产品推荐
相关产品推荐

