2014-09-11 13 views
30

Po raz pierwszy pracuję z plikami yaml, więc pierwszą myślą, na którą patrzyłem, było znalezienie dowolnej biblioteki, która mogłaby pomóc mi w analizie pliku.Parsowanie pliku yaml

Mam znaleźć dwie biblioteki YamlBean i SnakeYaml Nie jestem pewien, który będę używać.

Oto przykład pliku, który staram się analizować

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 

Plik zmieni dynamiczny więc nie wiem, ilu użytkowników lub grup plik będzie zawierać.

Informacje Chciałbym pobrać ze jest to nazwa użytkownika i grupy jak ten

user1 Premium 
user2 Mod 
user3 default 

iz grupami tylko nazwy grup, tak

Mod 
default 
Admin 

Każdy mógł dostać Zacząłem tutaj? i jaka jest najlepsza biblioteka do użycia? YamlBean lub SnakeYaml.

Zgaduję, że muszę zapisać informacje w czymś, co łatwo mógłbym powtórzyć.

Odpowiedz

7

I skończyło się na tym, że użyłem SnakeYaml i zrobiłem kilka rozszczepionych łańcuchów, aby rozwiązać mój problem.

Załadowany plik YAML do Object a następnie do Map, a następnie podzielić wynik z Map do String[], a następnie w for pętli I odczytać nazwę od String[]. Zrobiłem to samo z grupami.

Wiem, że istnieją lepsze rozwiązania, ale jest to wystarczająco dobre dla tego projektu.

Dzięki wszystkim za odpowiedzi.

37

Można również użyć Jacksons YAML module.

Aby tego użyć, będziesz potrzebować kilku lekcji. Klasy modeli, które będą zawierać zawartość Twojego pliku i klasę, która zajmuje się odczytywaniem pliku YAML.

Klasa modelu korzeń mógłby wyglądać następująco:

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

    // getter methods ommitted 
} 

Użytkownik (*) Klasa:

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

    // getter methods ommitted 
} 

GroupType może być Enum zawierający wszystkie możliwe typy Grupa:

public enum GroupType { 
    Premium, Mod, Default 
} 

Nie zapominaj, że w pozycjach wyliczeniowych uwzględniana jest wielkość liter. Więc "premium" nie zadziała. W ten sposób można zbudować wszystkie klasy modeli. Każdy wpis sub powinien mieć własną klasę modelu.

teraz do części, w której można przeczytać, że plik YAML:

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

Jak widać, ta część jest bardzo miłe, bo nie trzeba wiele. Instancja pliku zawiera plik YAML. Można utworzyć takiego:

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

Zamiast File metoda readValue obsługuje również InputStream, java.io.Reader, String (z całą zawartością), java.net.URL i tablicę bajtów. Powinieneś znaleźć coś, co ci odpowiada.

(*) Należy rozważyć zmianę struktury pliku YAML, bo nie sądzę, że jest możliwe użycie klawiszy dynamicznych z Jackson (może ktoś wie więcej na ten temat):

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

Dzięki za poinformowanie mnie o module Jacksons YAML. Jednym z problemów jest to, że nie mam możliwości zmiany pliku yaml, jego utworzonego w innej aplikacji i po prostu go przeczytam. może jest możliwe używanie tego modułu mimo to? –

+0

@KristofferIsaksson Tak, możesz spróbować. Przeczytaj odpowiedź na to pytanie: http://stackoverflow.com/questions/17685508/jackson-de-serialiazation-with-unknow-dynamic-property jako przykład. Będziesz potrzebował innej klasy, która pobiera cały plik jako 'List >'. 'user1' będzie kluczem" gdzieś "na tej mapie. – Tom

0

YamlBean jest dołączany do numerycznego środowiska obliczeniowego języka Java DMelt (http://jwork.org/dmelt/). Możesz tworzyć pliki Yaml przy użyciu klasy jhplot.io.HFileYAML, która tworzy mapę klucz-wartość i zapisuje jako plik yaml.