YAML Jackson - 数组的锚键

时间:2017-10-11 13:42:57

标签: java parsing jackson yaml

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

即使在线YAML Parser告诉我它可以按我想要的方式解析,但是Jackson YAML解析器拒绝给我我想要的东西。

这是YAML文件:

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

在线YAML Parser告诉我&#34; e4&#34;和&#34; e3&#34;有&#34; e5&#34;小时候。

但是当我尝试用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["<<"])

所以,我想知道杰克逊会接受它的人是否有办法做到这一点?

更新

我也试过这个:

- 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])

1 个答案:

答案 0 :(得分:3)

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

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

现在你在问题中给杰克逊打了一个 YAML解析器,但事实并非如此。它仅使用SnakeYaml作为解析器。 SnakeYaml可以自己将YAML加载到用户定义的类,因此您可能更好地直接使用SnakeYaml API。 Afaik它正确处理别名。