- Чтение и запись YAML файлов на Java с Jackson
- Что такое YAML?
- Чтение YAML с Jackson
- Запись YAML с Jackson
- Вывод
- Источник:
- How to load YAML data and map to Java Objects in SnakeYAML?
- Mapping to Java Object
- src/main/resources/person.yml
- Output
- Mapping to list of Java objects
- src/main/resources/persons.yml
- Output
- Load As Map
- Output
- Example Project
- 2. YAML file to an Object conversion :
- 2.1 Main class for YAML file to an Object conversion :
- YAML file contents – Person.yaml :
- YamlToObjectConversion.java
- Output in console :
- Related Articles :
- References :
Чтение и запись 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 .
После определения нескольких свойств , таких как name , wage и 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 com.fasterxml.jackson.core jackson-databind
Нам понадобится 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, Listcolleagues) < 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()
Теперь мы будем читать файл 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.
Источник:
How to load YAML data and map to Java Objects in SnakeYAML?
In this tutorial, we will learn how to map YAML data to Java Objects in SnakeYAML.
Mapping to Java Object
src/main/resources/person.yml
name: Joe phone: 111-111-11111 address: Park Dr, Charlie Hill
public class LoadAsJavaObject < public static void main(String[] args) throws IOException < Yaml yaml = new Yaml(); try (InputStream in = LoadAsJavaObject.class .getResourceAsStream("/person.yml")) < Person person = yaml.loadAs(in, Person.class); System.out.println(person); >> >
Output
Mapping to list of Java objects
src/main/resources/persons.yml
persons: - name: Joe phone: 111-111-1111 address: Park Dr, Charlie Hill - name: Trish phone: 111-111-11111 address: Small Vine, River Town
public class Persons < private Listpersons; . >
public class LoadAsJavaObjectList < public static void main(String[] args) throws IOException < Yaml yaml = new Yaml(); try (InputStream in = LoadAsJavaObject.class.getResourceAsStream("/persons.yml")) < Persons persons = yaml.loadAs(in, Persons.class); for (Person person : persons.getPersons()) < System.out.println(person); >> > >
Output
Load As Map
public class LoadAsMap < public static void main(String[] args) throws IOException < loadFromFile("/person.yml"); loadFromFile("/persons.yml"); >private static void loadFromFile(String path) throws IOException < System.out.printf("-- loading from %s --%n", path); Yaml yaml = new Yaml(); try (InputStream in = LoadAsMap.class.getResourceAsStream(path)) < Iterableitr = yaml.loadAll(in); for (Object o : itr) < System.out.println("Loaded object type:" + o.getClass()); System.out.println(o); >> > >
Output
-- loading from /person.yml --
Loaded object type:class java.util.LinkedHashMap
-- loading from /persons.yml --
Loaded object type:class java.util.LinkedHashMap, ]>
Example Project
Dependencies and Technologies Used:
2. YAML file to an Object conversion :
2.1 Main class for YAML file to an Object conversion :
YAML file contents – Person.yaml :
--- title: "Mr." firstName: "Sam" lastName: "Anton" address: flatNumber: "BV-1025" buildingName: "Shivaji" plotNumber: "1093" sector: "Sector 19" city: "Bengaluru" state: "Karnataka" country: "India" nodeName: "South Bengaluru" items: - itemName: "Television" itemBoughtYear: "2014" - itemName: "Washing Machine" itemBoughtYear: "2020" - itemName: "Refrigerator" itemBoughtYear: "2011" - itemName: "Grinder" itemBoughtYear: "2012" - itemName: "Computer" itemBoughtYear: "2010"
YamlToObjectConversion.java
package in.bench.resources.yaml.conversion; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; public class YamlToObjectConversion < public static void main(String[] args) < // create ObjectMapper to write to file ObjectMapper mapper = new ObjectMapper(new YAMLFactory()); try < String content = new String(Files.readAllBytes(Paths.get( "C:\\Users\\Demo\\eclipse-workspace\\YamlConversion\\Person.yaml"))); // read from file Person person = mapper.readValue(content, Person.class); System.out.println(person); >catch (JsonMappingException e) < e.printStackTrace(); >catch (JsonProcessingException e) < e.printStackTrace(); >catch (IOException e) < // TODO Auto-generated catch block e.printStackTrace(); >> >
Output in console :
Person [title=Mr., firstName=Sam, lastName=Anton, address=Address [flatNumber=BV-1025, buildingName=Shivaji, plotNumber=1093, sector=Sector 19, NodeName=South Bengaluru, city=Bengaluru, state=Karnataka, country=India], items=[Item [itemName=Television, itemBoughtYear=2014], Item [itemName=Washing Machine, itemBoughtYear=2020], Item [itemName=Refrigerator, itemBoughtYear=2011], Item [itemName=Grinder, itemBoughtYear=2012], Item [itemName=Computer, itemBoughtYear=2010]]]
In the following articles, we will discuss about YAML file to JSON and vice-versa conversions in detail
Related Articles :
- Gson – Java Object to JSON conversion
- Jackson – Java Object to JSON conversion
- Java – How to convert an Object to YAML using ObjectMapper ?
- Java – How to convert YAML to an Object using ObjectMapper ?
- Java – How to convert YAML to JSON using ObjectMapper ?
- Java – How to convert JSON to YAML using ObjectMapper ?
- Java – How to convert XML to JSON using ObjectMapper ?
- Java – How to convert JSON to XML using ObjectMapper ?
- Java – How to convert XML to YAML using ObjectMapper ?
- Java – How to convert YAML to XML using ObjectMapper ?
- Java – How to pretty-print JSON using ObjectMapper ?
- Java – How to convert XML to JSON using JSONObject ?
- Java – How to convert JSON to XML using JSONObject ?
- Java – How to pretty-print JSON using JSONObject ?
References :
Happy Coding !!
Happy Learning !!