如何用Jackson将Kotlin对象序列化为以对象值为节点名的YAML?
可行,实现方案如下
要实现将对象属性值作为YAML节点名的需求,你可以通过自定义Jackson序列化器配合数据结构调整来完成,具体步骤如下:
1. 调整数据结构并添加序列化注解
在Department类的employees字段上添加自定义序列化器注解,指定将列表序列化为以员工全名为键的映射:
import com.fasterxml.jackson.databind.annotation.JsonSerialize data class Department( val name: String, @JsonSerialize(using = EmployeeListSerializer::class) val employees: List<Employee> ) data class Employee(val firstName: String, val lastName: String, val age: Int) // 包裹顶层部门映射的类,生成YAML根节点结构 data class Company(val departments: Map<String, Department>)
2. 实现自定义序列化器
编写EmployeeListSerializer,将List<Employee>序列化为键为员工全名(firstName + lastName)的Map结构:
import com.fasterxml.jackson.core.JsonGenerator import com.fasterxml.jackson.databind.SerializerProvider import com.fasterxml.jackson.databind.ser.std.StdSerializer class EmployeeListSerializer : StdSerializer<List<Employee>>(List::class.java) { override fun serialize( value: List<Employee>, gen: JsonGenerator, provider: SerializerProvider ) { gen.writeStartObject() value.forEach { employee -> val fullName = "${employee.firstName} ${employee.lastName}" gen.writeObjectField(fullName, employee) } gen.writeEndObject() } }
3. 执行序列化操作
将部门列表转换为以部门名为键的Map,再通过YAMLMapper序列化得到目标结构:
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper import com.fasterxml.jackson.module.kotlin.KotlinModule fun main() { // 构造测试数据 val steve = Employee("Steve", "Jobs", 24) val itDept = Department("I.T", listOf(steve)) val company = Company(mapOf(itDept.name to itDept)) // 初始化YAML映射器,加载Kotlin模块支持 val yamlMapper = YAMLMapper.builder() .addModule(KotlinModule()) .build() // 序列化为YAML字符串 val yamlOutput = yamlMapper.writeValueAsString(company) println(yamlOutput) }
输出结果
执行代码后会生成你需要的YAML结构:
departments: I.T: name: "I.T" employees: Steve Jobs: firstName: "Steve" lastName: "Jobs" age: 24
原理说明
Jackson的自定义序列化器允许你完全控制集合或对象的序列化逻辑,这里我们将List<Employee>转换为以员工全名为键的Map,同时顶层通过Map<String, Department>将部门名称作为节点键,最终生成符合需求的YAML结构。
内容的提问来源于stack exchange,提问作者edward_wong
相关产品推荐
相关产品推荐

