【问题标题】:YAML Jackson - Anchor keys of ArrayYAML Jackson - 数组的锚键
【发布时间】:2018-03-23 05:19:53
【问题描述】:

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

尽管 Online 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 解析器告诉我“e4”和“e3”有“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["<<"])

那么,我想知道是否有人有办法在杰克逊接受的情况下做到这一点?

更新

我也试过这个:

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

【问题讨论】:

    标签: java parsing jackson yaml


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2017-02-25
    • 2018-04-27
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多