gpt4 book ai didi

java - YAML Jackson - 数组的 anchor 键

转载 作者:行者123 更新时间:2023-12-02 20:37:49 25 4
gpt4 key购买 nike

我正在尝试将 YAML 文件解析为对象。

尽管在线 YAML 解析器告诉我它可以按照我想要的方式解析,但 Jackson YAML 解析器拒绝给我我想要的东西。

这是 YAML 文件:

- nom: "service1"
etats : &e1s1
- nom: "e1"
childs:
- nom: "e2"
childs:
- nom: "e3"
childs:
- &a
nom: "e5"
- nom: "e4"
childs:
- <<: *a

在线 YAML 解析器告诉我“e4”和“e3”的 child 是“e5”。

但是,当我尝试用 Jackson 解析它时,出现以下错误:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "<<" (class Etat), not marked as ignorable (4 known properties: "dependsOnAnotherService", "nom", "hasToken", "childs"])
at [Source: (File); line: 13, column: 21] (through reference chain: java.lang.Object[][0]->Service["etats"]->java.util.ArrayList[0]->Etat["childs"]->java.util.ArrayList[1]->Etat["childs"]->java.util.ArrayList[0]->Etat["<<"])

所以,我想知道是否有人有办法在 Jackson 接受的情况下做到这一点?

更新

我也试过这个:

- nom: "service1"
etats : &e1s1
- nom: "e1"
childs:
- nom: "e2"
childs:
- nom: "e3"
childs:
- &a
nom: "e5"
- nom: "e4"
childs:
- *a

但是得到:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `Etat` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('a')
at [Source: (File); line: 13, column: 15] (through reference chain: java.lang.Object[][0]->Service["etats"]->java.util.ArrayList[0]->Etat["childs"]->java.util.ArrayList[1]->Etat["childs"]->java.util.ArrayList[0])

最佳答案

<<不是核心 YAML 功能,仅被指定为过时的 YAML 1.1 的可选标记(参见 here )。因此, jackson 完全有权不支持它。相反,它会尝试解析 <<作为字段名,这显然失败了,因为没有这样的字段。

您的第二种方法更合适,因为它仅使用核心 YAML 功能。您得到的错误指向 Jackson 中的错误,因为它错误地对待别名 *a作为 String 而不是解析它。提交错误报告可能是个好主意。

现在您在问题中将 Jackson 称为 YAML 解析器,但事实并非如此。它仅使用 SnakeYaml 作为解析器。 SnakeYaml 可以自己加载 YAML 到用户定义的类,所以你最好直接使用 SnakeYaml API . Afaik 它可以正确处理别名。

关于java - YAML Jackson - 数组的 anchor 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46689801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com