【问题标题】:Configure array/object indentation for YAML in Jackson在 Jackson 中为 YAML 配置数组/对象缩进
【发布时间】:2026-01-18 10:15:02
【问题描述】:

我正在尝试从输入 Map 生成 YAML 文件,我正在使用 Jackson 和 Jackson 提供的 YamlFactory 实用程序来执行此操作。我正在尝试为 YAML 输出配置缩进属性,但似乎根本没有考虑到这一点。

我的代码如下所示:

fun getSdkResultAsGenericObject(sdkResult: Any?): Any? {
        if (sdkResult == null) {
            return null
        }

        var genericObj: Any?
        val stringified = genericSdkObjectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(sdkResult)
            .replace("\n", "") 

        val isArray = stringified.startsWith("[")

        genericObj = if (isArray) {
            genericSdkObjectMapper.readValue(stringified, List::class.java)
        } else {
            genericSdkObjectMapper.readValue(stringified, LinkedHashMap::class.java)
        }

        val defaultYaml = resultYamlMapper.writerWithDefaultPrettyPrinter().writeValueAsString(genericObj )
    }

resultYamlMapper 的声明是这样的:

    val yamlFactory = YAMLFactory()
                        .configure(YAMLGenerator.Feature.SPLIT_LINES, false)
                        .configure(YAMLGenerator.Feature.INDENT_ARRAYS, true)
    val resultYamlMapper = ObjectMapper(YamlFactory())

文档说INDENT_ARRAYS 功能默认使用 2 个空格。我试图了解如何配置它?在生成的 YAML 中我需要 4 个空格。我尝试设置一个漂亮的印刷作家:

    val yamlFactory = YAMLFactory()
                        .configure(YAMLGenerator.Feature.SPLIT_LINES, false)
                        .configure(YAMLGenerator.Feature.INDENT_ARRAYS, true)
    val resultYamlMapper = ObjectMapper(YamlFactory())
    
    val arrayIndenter = DefaultIndenter("     ", DefaultIndenter.SYS_LF)
    val objectIndenter = DefaultIndenter("     ", DefaultIndenter.SYS_LF)

    resultYamlMapper.setDefaultPrettyPrinter(DefaultPrettyPrinter().withObjectIndenter(objectIndenter).withArrayIndenter(arrayIndenter))

但这似乎根本不被尊重。有什么想法吗?或者杰克逊根本不允许你配置缩进?

【问题讨论】:

    标签: kotlin jackson yaml


    【解决方案1】:

    The docs 表明PrettyPrinter 接口仅适用于JsonGenerator

    如果您想自定义 YAML 输出,您必须直接使用 SnakeYAML API(Jackson 使用该 API 进行 YAML 处理)。 SnakeYAML 有similar features to Jackson,如果你只想处理 YAML,几乎没有理由使用 Jackson。最重要的是,它可以让您配置 YAML 格式。

    【讨论】:

    • 感谢您的建议。我也在研究 SnakeYaml,但那里有很多不同之处。不仅如此,我还想知道 YAML 输出是否完全可以使用 Jackon 进行定制。例如,您有此功能 - javadoc.io/doc/com.fasterxml.jackson.dataformat/… 将其缩进默认为 2 个空格,但似乎无法自定义?