Рубрики
Без рубрики

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

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

Автор оригинала: David Landup.

Вступление

Файлы 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

Синтаксис действительно прост, словарь (наша сущность сотрудника) представлен с помощью <ключ>: <значение> .

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

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

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

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

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

Чтение YAML с Джексоном

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

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

Используя Jackson в качестве нашей библиотеки, мы находимся в знакомой среде, и многие приложения Java уже используют 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 , с содержанием:

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

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

// Loading the YAML file from the /resources folder
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
File file = new File(classLoader.getResource("person.yaml").getFile());

// Instantiating a new ObjectMapper as a YAMLFactory
ObjectMapper om = new ObjectMapper(new YAMLFactory());

// Mapping the employee from the YAML file to the Employee class
Employee employee = om.readValue(file, Employee.class);

// Printing out the information
System.out.println("Employee info " + employee.toString());

// Access the first element of the list and print it as well
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

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

Написание YAML с Джексоном

С чтением и отображением в стороне, давайте также продолжим запись в файл YAML.

Git Essentials

Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!

В отличие от использования метода 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));

// We want to save this Employee in a YAML file
Employee employee = new Employee("David", 1500, "Developer", colleagues);

// ObjectMapper is instantiated just like before
ObjectMapper om = new ObjectMapper(new YAMLFactory());

// We write the `employee` into `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 Джексоном.

Вывод

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

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