jackson - 使用 Jackson 解析 YAML 文件时出现 UnrecognizedPropertyException
问题描述
我正在尝试在 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
如果将嵌套值与点作为分隔符内联注释,则杰克逊似乎无法解析嵌套值。这是不正确的 YAML,还是非常规的?
我知道 Spring Boot 可以解析这种嵌套的 YAML 参数,我猜他们也使用 Jackson。但是我找不到如何配置ObjectMapper
它的方法。
有人可以帮我告诉我如何配置ObjectMapper
或其他需要做的事情吗?
解决方案
在 YAML 中,点不是特殊字符,只是内容的一部分。第一个文件包含两个映射,内部的一个noise.max
作为键,而第二个文件包含三个映射,其中最里面max
的一个作为键,上面的一个noise
作为键。这些是不同的结构。
Spring boot 将 YAML 映射到 Properties。它通过点连接嵌套键来实现。如果您这样做,您的两个 YAML 文件的结果将是:
template.noise.max = 0.01
这就是它与 Spring Boot 一起使用的原因。
属性文件是键/值对列表,而 YAML 文件描述了可能复杂的节点图。Spring boot 使用 YAML 作为 Properties 的语法糖。如果您使用 Jackson,您将处理实际结构,而不是使用 Spring Boot 获得的简化结构。
所以底线是:如果你想使用 YAML 库来加载 YAML,你将没有这个用键中的点替换嵌套映射的“功能”。从理论上讲,您可以使用 SnakeYAML 在事件级别进行一些预处理以拆分此类键,以便您想要的成为可能,但我不推荐它。