2017-10-11 10 views
0

オブジェクトにYAMLファイルを解析しようとしています。YAML Jackson - 配列のアンカーキー

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" を持っていることを私に伝えます。

しかし、私はジャクソンでこれを解析しようとすると、私は次のエラーを取得する:

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

<<は、コアYAMLの機能ではなく、唯一のオプションのタグとして指定されました旧式のYAML 1.1(here参照)。したがって、ジャクソンはそれをサポートしないあらゆる権利を持っています。代わりに、フィールド名として<<を解析しようとしますが、そのようなフィールドがないため明らかに失敗します。

2番目の方法は、コアYAML機能のみを使用するため、より適切です。このエラーは、別名*aを解決する代わりに文字列として誤って扱うため、Jacksonのバグを指摘するエラーになります。バグレポートを提出することをお勧めします。

ここでは、あなたの質問には、YAMLパーサーと呼んでいます。これは単にパーサーとしてSnakeYamlを使用します。 SnakeYamlはユーザー定義クラスにYAMLを単独でロードすることができるので、SnakeYaml APIを直接使用するほうがよいかもしれません。 Afaikはエイリアスを正しく処理します。

+0

ジャクソンYAMLモジュールがhttps://github.com/FasterXML/jackson-dataformats-text/tree/master/yamlに従ってSnakeYAMLを使用しているようですが、これはうまくいくでしょうが – Namoz

+1

はい、低レベルエイリアスをまだ解決していないインターフェイス。 – flyx

+0

私はあなたが正しいと思うので、代わりにYAMLBeansを使いました。 – Namoz

関連する問題