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

Введение Файлы YAML [https://yaml.org/] в настоящее время широко используются для определения свойств инструментов и приложений из-за очень удобочитаемого синтаксиса. Помимо свойств конфигурации, они также часто используются для передачи / сериализации данных, подобно тому, как используется JSON. Чтение и запись файлов YAML быстро становится базовым навыком разработчика, аналогичным чтению и записи файлов JSON и XML. Что такое ЯМЛ? YAML Ain't Markup Language (YAML) - это просто

Вступление

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

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

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

Что такое ЯМЛ?

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

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

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

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

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

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

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

 --- 
 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 аналогично тому, как мы уже привыкли делать с двумя ранее упомянутыми форматами.

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

Для начала добавим Джексона в наш проект через Maven:

 <dependency> 
 <groupId>com.fasterxml.jackson.core</groupId> 
 <artifactId>jackson-dataformat-yaml</artifactId> 
 <version>{$version}</version> 
 </dependency> 
 
 <dependency> 
 <groupId>com.fasterxml.jackson.core</groupId> 
 <artifactId>jackson-databind</artifactId> 
 <version>{$version}</version> 
 </dependency> 

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

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

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

 public class Employee { 
 
 public Employee(String name, int wage, String position, List<Employee> 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<Employee> 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 

Мы сопоставим этот файл с экземпляром нашего Employee используя класс Джексона 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 

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

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

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

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

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

 List<Employee> colleagues = new ArrayList<Employee>(); 
 
 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 

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

Заключение

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

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

comments powered by Disqus