使用 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 在事件级别做一些预处理来拆分这些键,这样你想要的是可能的,但我不推荐它。
我正在尝试使用 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 在事件级别做一些预处理来拆分这些键,这样你想要的是可能的,但我不推荐它。