web-dev-qa-db-fra.com

Analyser un fichier yaml

C’est la première fois que je travaille avec des fichiers yaml. La première chose à laquelle j’ai pensé est que j’ai cherché à trouver une bibliothèque capable de m'aider à analyser le fichier.

J'ai trouvé deux bibliothèques YamlBean et SnakeYaml je ne suis pas sûr de celle que je vais utiliser.

Voici un exemple du fichier que j'essaye d'analyser

users:
  user1:
    groups:
    - Premium
  user2:
    groups:
    - Mod
  user3:
    groups:
    - default
groups:
  Mod:
    permissions:
      test: true
    inheritance:
    - Premium
  default:
    permissions:
      test.test: true
    inheritance:
    - Mod
  Admin:
    permissions:
      test.test.test: true
    inheritance:
    - Mod

Le fichier va changer de façon dynamique, donc je ne sais pas combien d'utilisateurs ou de groupes le fichier contiendra.

Les informations que je voudrais extraire de ceci sont le nom d'utilisateur et le groupe comme celui-ci

user1 Premium
user2 Mod
user3 default

et des groupes seulement les noms de groupe, comme ceci

Mod
default
Admin

Quelqu'un pourrait-il me faire commencer ici? et quelle est la meilleure bibliothèque à utiliser pour cela? YamlBean ou SnakeYaml.

Je suppose que j'ai besoin de sauvegarder les informations dans quelque chose que je pourrais facilement parcourir.

48
Kristoffer Isaksson

J'ai fini par utiliser SnakeYaml et j'ai créé des chaînes pour résoudre mon problème.

Chargez le fichier yaml dans Object puis dans un Map, puis divisez le résultat du Map en String[] puis dans une boucle for, je lis le nom du String[]. J'ai fait la même chose avec les groupes.

Je sais qu'il existe de meilleures solutions, mais c'est suffisant pour ce projet.

Merci à tous pour les réponses.

15
Kristoffer Isaksson

Vous pouvez également utiliser module Jacksons YAML .

Pour l'utiliser, vous aurez besoin de quelques cours. Les classes de modèle qui porteront le contenu de votre fichier et la classe qui se charge de lire le fichier YAML.

La classe de modèle racine pourrait ressembler à ceci:

public class MyYamlFile {
    @JsonProperty
    private List<User> users;
    @JsonProperty
    private List<Group> groups;

    // getter methods ommitted
}

La classe utilisateur (*):

public class User {
    @JsonProperty
    private List<String> name;
    @JsonProperty
    private List<GroupType> groups;

    // getter methods ommitted
}

Le GroupType peut être un Enum contenant tous les types de groupes possibles:

public enum GroupType {
    Premium, Mod, Default
}

N'oubliez pas que les entrées enum sont sensibles à la casse. Donc, "premium" ne fonctionnera pas. Vous pouvez construire toutes vos classes de modèle de cette façon. Chaque sous-entrée doit avoir sa propre classe de modèle.

Passons maintenant à la partie où vous pouvez lire ce fichier YAML:

public MyYamlFile readYaml(final File file) {
    final ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); // jackson databind
    return mapper.readValue(file, MyYamlFile.class);
}

Comme vous pouvez le constater, cette partie est vraiment chouette, car vous n’avez pas besoin de beaucoup. L'instance de fichier contient votre fichier YAML. Vous pouvez en créer un comme ceci:

File file = new File("path/to/my/yaml/usersAndGroups.yaml");

Au lieu de File, la méthode readValue prend également en charge InputStream, Java.io.Reader, String (avec tout le contenu), Java.net.URL et tableau d'octets. Vous devriez trouver quelque chose qui vous convient.

(*) Vous devriez envisager de changer la structure de votre fichier YAML, car je ne pense pas qu'il soit possible d'utiliser des clés dynamiques avec Jackson (peut-être que quelqu'un en sait plus à ce sujet):

users: 
    - name: user1
      groups:
        - Premium
    - name: user2
      groups:
        - Mod
    - name: user3
      groups:
        - Default
groups:
    ....
50
Tom

YamlBean est inclus dans DMelt Java environnement de calcul numérique ( http://jwork.org/dmelt/ ). Vous pouvez créer des fichiers Yaml à l'aide de la classe jhplot.io.HFileYAML. qui crée une carte clé-valeur et enregistre en tant que fichier yaml.

0
Tina21