Подтвердить что ты не робот

Разбор файла yaml

Это первый раз, когда я работаю с файлами yaml, поэтому первым, на мой взгляд, было найти любую библиотеку, которая могла бы помочь мне разобрать файл.

Я нашел две библиотеки YamlBean и SnakeYaml Я не уверен, какой из них я буду использовать.

Вот пример файла, который я пытаюсь разобрать

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

Файл изменится динамически, поэтому я не знаю, сколько пользователей или групп будет содержать файл.

Информация, которую я хотел бы извлечь из этого, - это имя пользователя и группа, подобная этой

user1 Premium
user2 Mod
user3 default

а из групп - только имена групп, например

Mod
default
Admin

Кто-нибудь может заставить меня начать здесь? и какова лучшая библиотека для этого? YamlBean или SnakeYaml.

Я думаю, мне нужно сохранить информацию в чем-то, что я легко мог бы перебрать.

4b9b3361

Ответ 1

В итоге я использовал SnakeYaml и сделал несколько разделенных строк для решения моей проблемы.

Загрузили файл yaml в Object, а затем в Map, а затем разделили результат с Map на String[], а затем в цикле for я зачитал имя из String[], Я сделал то же самое с группами.

Я знаю, что есть лучшие решения, но это достаточно хорошо для этого проекта.

Спасибо всем за ответы.

Ответ 2

Вы также можете использовать модуль YAML Jacksons.

Чтобы использовать это, вам понадобится несколько классов. Классы моделей, которые будут содержать содержимое вашего файла и класс, который заботится о чтении файла YAML.

Класс корневой модели может выглядеть следующим образом:

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

    // getter methods ommitted
}

Класс пользователя (*):

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

    // getter methods ommitted
}

Тип GroupType может быть Enum, содержащим все возможные типы групп:

public enum GroupType {
    Premium, Mod, Default
}

Не забывайте, что записи перечисления чувствительны к регистру. Так что "премиум" не будет работать. Таким образом вы можете построить все классы модели. Каждая подзаголовка должна иметь собственный класс модели.

Теперь в ту часть, где вы можете прочитать этот файл YAML:

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

Как вы можете видеть, эта часть действительно аккуратная, потому что вам не нужно многого. Экземпляр файла содержит ваш файл YAML. Вы можете создать такой способ:

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

Вместо File метод readValue также поддерживает InputStream, java.io.Reader, String (со всем содержимым), java.net.URL и массив байтов. Вы должны найти то, что вам подходит.

(*) Вам следует рассмотреть возможность изменения структуры вашего файла YAML, потому что я не думаю, что можно использовать динамические клавиши с Jackson (возможно, кто-то знает об этом больше):

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

Ответ 3

YamlBean включен в числовую вычислительную среду DMelt Java (http://jwork.org/dmelt/). Вы можете создавать файлы Yaml с помощью класса jhplot.io.HFileYAML, который создает карту значений ключа и сохраняет как файл yaml.