2017-10-11 2 views
0

J'essaye d'analyser un fichier YAML dans un objet.YAML Jackson - Anchor keys of Array

Même si Online YAML Parser me dit qu'il est analysable comme je le souhaite, le parseur de Jackson YAML refuse de me donner ce que je veux.

Voici le fichier YAML:

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

en ligne YAML Parser me dit que "e4" et "e3" ont "e5" comme un enfant.

Cependant lorsque je tente d'analyser cela avec Jackson, je reçois l'erreur suivante:

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

Alors, je voudrais savoir si quelqu'un a une façon de faire où Jackson va l'accepter?

Mise à jour

J'ai aussi essayé ceci:

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

Mais obtenez:

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

Répondre

1

<< est pas une caractéristique YAML de base et n'a été spécifié comme une balise facultative pour YAML 1.1 obsolète (voir here). Par conséquent, Jackson a le droit de ne pas le soutenir. Au lieu de cela, il essaie d'analyser << comme un nom de champ, ce qui échoue évidemment parce qu'il n'y a pas un tel champ.

Votre deuxième approche est plus appropriée car elle utilise uniquement des fonctionnalités de base YAML. L'erreur que vous obtenez pointe un bug dans Jackson car il traite incorrectement l'alias *a comme une chaîne au lieu de le résoudre. Ce peut être une bonne idée de déposer un rapport de bogue.

Maintenant vous appelez Jackson un YAML parser dans votre question que ce n'est pas. Il utilise simplement SnakeYaml comme analyseur. SnakeYaml peut charger YAML à des classes définies par l'utilisateur par lui-même, donc vous pouvez être mieux d'utiliser directement le SnakeYaml API. Afaik gère correctement les alias.

+0

Je pensais que cela fonctionnerait parce que le module Jackson YAML semble utiliser SnakeYAML selon https://github.com/FasterXML/jackson-dataformats-text/tree/master/yaml – Namoz

+1

Oui, mais il peut utiliser le bas niveau interface qui ne résout pas encore les alias. – flyx

+0

Je pense que vous avez raison, j'ai donc utilisé YAMLBeans à la place, et cela fonctionne très bien. – Namoz