首页 > 解决方案 > 使用 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或其他需要做的事情吗?

标签: jacksonyamljackson-databind

解决方案


在 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 在事件级别进行一些预处理以拆分此类键,以便您想要的成为可能,但我不推荐它。


推荐阅读