Разбор файла 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.
Я думаю, мне нужно сохранить информацию в чем-то, что я легко мог бы перебрать.
Ответы
Ответ 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.