【问题标题】:UnrecognizedPropertyException while parsing YAML file with Jackson使用 Jackson 解析 YAML 文件时出现 UnrecognizedPropertyException
【发布时间】:2021-07-27 14:53:09
【问题描述】:

我正在尝试在 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 或其他需要做的事情吗?

【问题讨论】:

    标签: jackson yaml jackson-databind


    【解决方案1】:

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

    【讨论】:

    • 非常感谢您的回答。它向我解释了很多,我将不得不考虑如何将这些知识应用到我的用例中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多