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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:48:31