2014-09-11 11 views
30

Dies ist das erste Mal, dass ich mit yaml Dateien arbeite, also war das erste, was ich mir angeschaut habe, eine Bibliothek zu finden, die mir helfen könnte, die Datei zu parsen.Eine YAML-Datei parsen

Ich habe zwei Bibliothek YamlBean und SnakeYaml Ich bin mir nicht sicher, welche, die ich verwenden werde. Hier

ist ein Beispiel für die Datei, die ich

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 

Die Datei wird dynamisch zu analysieren versuchen ändern, damit ich weiß nicht, wie viele Benutzer oder Gruppen die Datei enthalten würde.

Die Informationen, die ich von diesem holen möchte, ist der Benutzername und die Gruppe wie diese

user1 Premium 
user2 Mod 
user3 default 

und aus den Gruppen nur den Gruppennamen, wie diese

Mod 
default 
Admin 

Jeder bekommen könnte Ich habe hier angefangen? und was ist die beste Bibliothek dafür? YamlBean oder SnakeYaml.

Ich denke, ich muss die Informationen in etwas speichern, das ich problemlos durchlaufen könnte.

Antwort

7

I endete mit SnakeYaml und machte einige Split-Strings, um mein Problem zu lösen.

geladen, um die YAML-Datei zu Object und dann in ein Map spaltete dann das Ergebnis aus den Map in String[] und dann in einer Schleife for las ich von den String[] die Namen aus. Ich habe das gleiche mit Gruppen gemacht.

Ich weiß, dass es bessere Lösungen gibt, aber das ist gut genug für dieses Projekt.

Vielen Dank für die Antworten.

37

Sie könnten auch Jacksons YAML module verwenden.

Um dies zu verwenden, benötigen Sie ein paar Klassen. Die Modellklassen, die den Inhalt Ihrer Datei enthalten, und die Klasse, die für das Lesen der YAML-Datei zuständig ist.

Die Wurzel Modellklasse könnte wie folgt aussehen:

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

    // getter methods ommitted 
} 

Der Benutzer (*) Klasse:

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

    // getter methods ommitted 
} 

Die Grouptype ein Enum könnte alle möglichen Gruppentypen enthalten:

public enum GroupType { 
    Premium, Mod, Default 
} 

Vergessen Sie nicht, dass die enum Einträge Groß-und Kleinschreibung beachten. Also "Premium" wird nicht funktionieren. Sie können alle Ihre Modellklassen auf diese Weise erstellen. Jeder Untereintrag sollte eine eigene Modellklasse erhalten.

Nun zu dem Teil, wo Sie diese YAML-Datei lesen können:

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

Wie Sie sehen können, ist dieser Teil wirklich ordentlich ist, weil Sie brauchen nicht viel. Die Dateiinstanz enthält Ihre YAML-Datei. Sie können einen wie folgt erstellen:

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

Statt File die readValue Methode unterstützt auch InputStream, java.io.Reader, String (mit dem gesamten Inhalt), java.net.URL und Byte-Array. Sie sollten etwas finden, das zu Ihnen passt.

(*) Sie berücksichtigen sollen, die Struktur Ihrer YAML-Datei zu ändern, weil ich nicht glaube, es möglich ist, mit Jackson dynamischen Schlüssel zu verwenden (vielleicht weiß jemand mehr darüber):

users: 
    - name: user1 
     groups: 
     - Premium 
    - name: user2 
     groups: 
     - Mod 
    - name: user3 
     groups: 
     - Default 
groups: 
    .... 
+3

Vielen Dank für die Kenntnis von Jacksons YAML Modul. ein problem ist, dass ich nicht die möglichkeit habe, die yaml-datei zu ändern, die in einer anderen anwendung erstellt wurde und ich werde sie nur lesen. vielleicht ist es möglich, dieses Modul trotzdem zu verwenden? –

+0

@KristofferIsaksson Ja, du kannst es versuchen. Lesen Sie die Antwort auf diese Frage: http://stackoverflow.com/questions/17685508/jackson-de-serialiazation-with-unknow-dynamic-property als ein Beispiel. Sie benötigen eine andere Klasse, die die gesamte Datei als 'List >' akzeptiert. 'user1' wäre ein Schlüssel" irgendwo "in dieser Karte. – Tom

0

YamlBean ist in DMelt Java numerische Rechenumgebung enthalten (http://jwork.org/dmelt/). Sie können Yaml-Dateien mit der Klasse jhplot.io.HFileYAML erstellen, die eine Schlüssel/Wert-Map erstellt und als Yaml-Datei speichert.