DevGang
Авторизоваться

Чтение и запись YAML файлов на Java с Jackson

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

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

Чтение и запись файлов YAML быстро становится основным навыком разработчика, подобно тому, как чтение и запись файлов JSON и XML.

Что такое YAML?

YAML - это не другой язык разметки (YAML) - это простой, понятный человеку язык сериализации данных, очень похожий на JSON. Его легче читать и понимать, и он может ссылаться на другие элементы в файле YAML, а также встраивать в себя другие форматы, такие как JSON и XML.

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

Большинство файлов YAML можно преобразовать в JSON, и наоборот, поскольку YAML является расширенным набором JSON. Вот пример файла YAML:

--- #Employee Info
name: David
wage: 1500
position: Developer
techstack:
    - Java
    - Spring
    - Hibernate

Синтаксис действительно прост, словарь (наша сущность сотрудника) представлен как key: value.

После определения нескольких свойств , таких как namewageи position, список включается, опять же , с отступом с каждым элементом списка , начиная с -.

Каждый из этих элементов также может быть словарем:

---
name: David
wage: 1500
position: Developer
colleagues:
    -   name: Martha
        wage: 1500
        position: Developer
    -   name: Jim
        wage: 1800
        position: DevOps Engineer

Вы можете сократить словари и сформировать более сложные коллекции, хотя это выходит за рамки данного руководства.

Чтение YAML с Jackson

Jackson - чрезвычайно популярная библиотека на основе Java, используемая для анализа и манипулирования файлами JSON и XML.

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

Используя Jackson в качестве нашей библиотеки, мы находимся в знакомой среде, и во многих Java-приложениях в любом случае уже есть Jackson для других целей.

Во-первых, давайте добавим Jackson в наш проект через Maven:


    com.fasterxml.jackson.core
    jackson-dataformat-yaml
    {$version}



    com.fasterxml.jackson.core
    jackson-databind
    {$version}

Нам понадобится jackson-databind из которого мы извлечем класс ObjectMapper, и зависимость jackson-dataformat-yaml, из которой мы извлечем класс YAMLFactory.

Как и в случае с JSON и XML, основным классом, который мы будем использовать для этой задачи, будет класс ObjectMapper. Его метод readValue() используется для отображения источника (файл YAML) в результат (объект класса).

Давайте сначала определим простой класс, который мы хотели бы отобразить. Что касается предыдущего примера YAML, давайте создадим класс Employee:

public class Employee {

    public Employee(String name, int wage, String position, List colleagues) {
        this.name = name;
        this.wage = wage;
        this.position = position;
        this.colleagues = colleagues;
    }

    // Without a default constructor, Jackson will throw an exception
    public Employee() {}

    private String name;
    private int wage;
    private String position;
    private List colleagues;

    // Getters and setters

    @Override
    public String toString() {
        return "\nName: " + name + "\nWage: " + wage + "\nPosition: " + position + "\nColleagues: " + colleagues + "\n";
    }

Теперь мы будем читать файл YAML, скажем person.yaml, с содержимым:

person.yaml
---
name: David
wage: 1500
position: Developer
colleagues:
    -   name: Martha
        wage: 1500
        position: Developer
    -   name: Jim
        wage: 1800
        position: DevOps Engineer

Мы сопоставим этот файл с экземпляром нашего класса Employee, используя класс ObjectMapper:

// Загрузка файла YAML из папки
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
File file = new File(classLoader.getResource("person.yaml").getFile());

// Создание нового ObjectMapper как YAMLFactory
ObjectMapper om = new ObjectMapper(new YAMLFactory());

// Отображение сотрудника из файла YAML в класс Employee
Employee employee = om.readValue(file, Employee.class);

// Распечатка информации
System.out.println("Employee info " + employee.toString());

// Получите доступ к первому элементу списка и распечатайте его
System.out.println("Accessing first element: " + employee.getColleagues().get(0).toString());

Выполнение этого фрагмента кода даст нам:

Employee info
Name: David
Wage: 1500
Position: Developer
Colleagues: [
Name: Martha
Wage: 1500
Position: Developer
Colleagues: null
,
Name: Jim
Wage: 1800
Position: DevOps Engineer
Colleagues: null
]

Accessing first element:
Name: Martha
Wage: 1500
Position: Developer
Colleagues: null

Наш person.yamlфайл был сопоставлен с экземпляром объекта, который мы затем можем использовать для любых целей.

Запись YAML с Jackson

В отличие от использования метода readValue(), мы будем использовать метод writeValue(), определяющий, где будет конечный файл и объект, из которого мы сопоставляем файл YAML.

Давайте создадим экземпляр сотрудника и назначим несколько значений:

List colleagues = new ArrayList();

colleagues.add(new Employee("Mary", 1800, "Developer", null));
colleagues.add(new Employee("Jane", 1200, "Developer", null));
colleagues.add(new Employee("Tim", 1600, "Developer", null));
colleagues.add(new Employee("Vladimir", 1000, "Developer", null));

// Мы хотим сохранить этого сотрудника в файле YAML
Employee employee = new Employee("David", 1500, "Developer", colleagues);

// ObjectMapper создается так же, как и раньше
ObjectMapper om = new ObjectMapper(new YAMLFactory());

// Мы пишем `employee` в` person2.yaml`
om.writeValue(new File("/src/main/resources/person2.yaml"), employee);

Выполнение этого фрагмента кода даст нам YAML-файл с содержимым:

---
name: "David"
wage: 1500
position: "Developer"
colleagues:
- name: "Mary"
  wage: 1800
  position: "Developer"
  colleagues: null
- name: "Jane"
  wage: 1200
  position: "Developer"
  colleagues: null
- name: "Tim"
  wage: 1600
  position: "Developer"
  colleagues: null
- name: "Vladimir"
  wage: 1000
  position: "Developer"
  colleagues: null

Как вы можете видеть, Java-объект employee был сериализован в файл в формате YAML.

Вывод

Файлы с форматированием YAML становятся все более популярными для определения свойств инструментов и приложений из-за очень удобочитаемого синтаксиса. Помимо того, что они содержат свойства конфигурации, они также все чаще используются для передачи данных, подобно тому, как используется JSON, хотя их использование в этой области все еще не так распространено в дикой природе.

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

Источник:

#Java
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

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

Попробовать

Оплатив хостинг 25$ в подарок вы получите 100$ на счет

Получить