使用 Jackson 解析 YAML 文件时发生 UnrecognizedPropertyException

UnrecognizedPropertyException while parsing YAML file with Jackson

我正在尝试使用 Kotlin 中的 Jackson 解析以下 YAML 内容。

template:
  # More properties...
  noise.max: 0.01

我得到这个异常:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "noise.max" ...

当我将我的 YAML 更改为此时,它起作用了:

template:
  # More properties...
  noise:
    max: 0.01

Jackson 似乎无法解析嵌套值,如果它们是用点作为分隔符内联标注的话。这是不正确的 YAML 还是非常规的?

我知道 spring boot 可以解析这种嵌套的 YAML 参数,我猜他们也使用 Jackson。但是我找不到配置 ObjectMapper 的方法,所以它可以工作。

有人可以帮我告诉我如何配置 ObjectMapper 或其他需要做的事情吗?

在 YAML 中,点不是特殊字符,只是内容的一部分。第一个文件包含两个映射,内部一个以 noise.max 作为键,而第二个文件包含三个映射,其中最里面的一个以 max 作为键,上面一个以 noise作为关键。这些是不同的结构。

Spring 引导将 YAML 映射到属性。它通过 通过点 连接嵌套键来实现。如果您这样做,您的两个 YAML 文件的结果将是:

template.noise.max = 0.01

这就是它与 Spring 启动一起工作的原因。

属性 文件是 key/value 对的列表,而 YAML 文件描述的可能是复杂的节点图。 Spring boot 使用 YAML 作为属性的语法糖。如果您使用 Jackson,您将处理实际结构,而不是您通过 Spring 引导获得的简化结构。

所以底线是:如果你想使用 YAML 库来加载 YAML,你将没有这种用键中的点替换嵌套映射的“功能”。理论上你可以使用 SnakeYAML 在事件级别做一些预处理来拆分这些键,这样你想要的是可能的,但我不推荐它。