在 Jackson 中为 YAML 配置数组/对象缩进

问题描述 投票:0回答:2

我正在尝试从输入映射生成 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))

但这似乎根本没有得到尊重。有什么想法吗?或者 Jackson 根本不让你配置缩进?

kotlin jackson yaml
2个回答
0
投票

文档显示

PrettyPrinter
接口仅适用于
JsonGenerator

如果您想自定义 YAML 输出,则必须直接使用 SnakeYAML API(Jackson 使用该 API 进行 YAML 处理)。 SnakeYAML 与 Jackson 具有类似的功能,如果您只想处理 YAML,则没有理由使用 Jackson。最重要的是,它允许您配置 YAML 格式。


0
投票

您可以使用类似于以下内容的方式获得 2 个空格缩进。

ObjectMapper mapper = new ObjectMapper(new YAMLFactory().configure(YAMLGenerator.Feature.INDENT_ARRAYS_WITH_INDICATOR, true)
                                .disable(YAMLGenerator.Feature.USE_NATIVE_TYPE_ID)
                                .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES));

我在 2020 年的 github 功能请求中找到了这个答案

https://github.com/FasterXML/jackson-dataformats-text/issues/175

© www.soinside.com 2019 - 2024. All rights reserved.