我正在尝试从输入映射生成 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 根本不让你配置缩进?
您可以使用类似于以下内容的方式获得 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