diff --git a/libraries/.gitignore b/libraries/.gitignore
index ac45fafa62..e594daf27a 100644
--- a/libraries/.gitignore
+++ b/libraries/.gitignore
@@ -6,3 +6,4 @@
# Packaged files #
*.jar
+/bin/
diff --git a/libraries/pom.xml b/libraries/pom.xml
index 02ea1d4d51..b19a005d94 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -771,12 +771,20 @@
${hamcrest-all.version}
test
-
+
+
+ org.yaml
+ snakeyaml
+ ${snakeyaml.version}
+
+
+
org.eclipse.paho
org.eclipse.paho.client.mqttv3
1.2.0
+
@@ -914,6 +922,7 @@
+ 1.21
1.23.0
0.1.0
0.7.0
diff --git a/libraries/src/main/java/com/baeldung/snakeyaml/Address.java b/libraries/src/main/java/com/baeldung/snakeyaml/Address.java
new file mode 100644
index 0000000000..83c327a4ed
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/snakeyaml/Address.java
@@ -0,0 +1,41 @@
+package com.baeldung.snakeyaml;
+
+public class Address {
+ private String line;
+ private String city;
+ private String state;
+ private Integer zip;
+
+ public String getLine() {
+ return line;
+ }
+
+ public void setLine(String line) {
+ this.line = line;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public Integer getZip() {
+ return zip;
+ }
+
+ public void setZip(Integer zip) {
+ this.zip = zip;
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/snakeyaml/Contact.java b/libraries/src/main/java/com/baeldung/snakeyaml/Contact.java
new file mode 100644
index 0000000000..a808747786
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/snakeyaml/Contact.java
@@ -0,0 +1,26 @@
+package com.baeldung.snakeyaml;
+
+public class Contact {
+
+ private String type;
+
+ private int number;
+
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public int getNumber() {
+ return number;
+ }
+
+ public void setNumber(int number) {
+ this.number = number;
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/snakeyaml/Customer.java b/libraries/src/main/java/com/baeldung/snakeyaml/Customer.java
new file mode 100644
index 0000000000..c741f6dc85
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/snakeyaml/Customer.java
@@ -0,0 +1,53 @@
+package com.baeldung.snakeyaml;
+
+import java.util.List;
+
+public class Customer {
+
+ private String firstName;
+ private String lastName;
+ private int age;
+ private List contactDetails;
+ private Address homeAddress;
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public List getContactDetails() {
+ return contactDetails;
+ }
+
+ public void setContactDetails(List contactDetails) {
+ this.contactDetails = contactDetails;
+ }
+
+ public Address getHomeAddress() {
+ return homeAddress;
+ }
+
+ public void setHomeAddress(Address homeAddress) {
+ this.homeAddress = homeAddress;
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/snakeyaml/JavaToYAMLSerializationUnitTest.java b/libraries/src/test/java/com/baeldung/snakeyaml/JavaToYAMLSerializationUnitTest.java
new file mode 100644
index 0000000000..f6836f6d56
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/snakeyaml/JavaToYAMLSerializationUnitTest.java
@@ -0,0 +1,54 @@
+package com.baeldung.snakeyaml;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.StringWriter;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.junit.Test;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.nodes.Tag;
+
+import com.baeldung.snakeyaml.Customer;
+
+public class JavaToYAMLSerializationUnitTest {
+
+ @Test
+ public void whenDumpMap_thenGenerateCorrectYAML() {
+ Map data = new LinkedHashMap();
+ data.put("name", "Silenthand Olleander");
+ data.put("race", "Human");
+ data.put("traits", new String[] { "ONE_HAND", "ONE_EYE" });
+ Yaml yaml = new Yaml();
+ StringWriter writer = new StringWriter();
+ yaml.dump(data, writer);
+ String expectedYaml = "name: Silenthand Olleander\nrace: Human\ntraits: [ONE_HAND, ONE_EYE]\n";
+ assertEquals(expectedYaml, writer.toString());
+ }
+
+ @Test
+ public void whenDumpACustomType_thenGenerateCorrectYAML() {
+ Customer customer = new Customer();
+ customer.setAge(45);
+ customer.setFirstName("Greg");
+ customer.setLastName("McDowell");
+ Yaml yaml = new Yaml();
+ StringWriter writer = new StringWriter();
+ yaml.dump(customer, writer);
+ String expectedYaml = "!!com.baeldung.snakeyaml.Customer {age: 45, contactDetails: null, firstName: Greg,\n homeAddress: null, lastName: McDowell}\n";
+ assertEquals(expectedYaml, writer.toString());
+ }
+
+ @Test
+ public void whenDumpAsCustomType_thenGenerateCorrectYAML() {
+ Customer customer = new Customer();
+ customer.setAge(45);
+ customer.setFirstName("Greg");
+ customer.setLastName("McDowell");
+ Yaml yaml = new Yaml();
+ String expectedYaml = "{age: 45, contactDetails: null, firstName: Greg, homeAddress: null, lastName: McDowell}\n";
+ assertEquals(expectedYaml, yaml.dumpAs(customer, Tag.MAP, null));
+ }
+
+}
diff --git a/libraries/src/test/java/com/baeldung/snakeyaml/YAMLToJavaDeserialisationUnitTest.java b/libraries/src/test/java/com/baeldung/snakeyaml/YAMLToJavaDeserialisationUnitTest.java
new file mode 100644
index 0000000000..56cd3c2b2e
--- /dev/null
+++ b/libraries/src/test/java/com/baeldung/snakeyaml/YAMLToJavaDeserialisationUnitTest.java
@@ -0,0 +1,131 @@
+package com.baeldung.snakeyaml;
+
+import org.junit.Test;
+import org.yaml.snakeyaml.TypeDescription;
+import org.yaml.snakeyaml.Yaml;
+import org.yaml.snakeyaml.constructor.Constructor;
+
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+public class YAMLToJavaDeserialisationUnitTest {
+
+ @Test
+ public void whenLoadYAMLDocument_thenLoadCorrectMap() {
+ Yaml yaml = new Yaml();
+ InputStream inputStream = this.getClass()
+ .getClassLoader()
+ .getResourceAsStream("yaml/customer.yaml");
+ Map obj = yaml.load(inputStream);
+ assertEquals("John", obj.get("firstName"));
+ assertEquals("Doe", obj.get("lastName"));
+ assertEquals(20, obj.get("age"));
+ }
+
+ @Test
+ public void whenLoadYAMLDocumentWithTopLevelClass_thenLoadCorrectJavaObject() {
+ Yaml yaml = new Yaml(new Constructor(Customer.class));
+ InputStream inputStream = this.getClass()
+ .getClassLoader()
+ .getResourceAsStream("yaml/customer.yaml");
+ Customer customer = yaml.load(inputStream);
+ assertEquals("John", customer.getFirstName());
+ assertEquals("Doe", customer.getLastName());
+ assertEquals(20, customer.getAge());
+ }
+
+ @Test
+ public void whenLoadYAMLDocumentWithAssumedClass_thenLoadCorrectJavaObject() {
+ Yaml yaml = new Yaml();
+ InputStream inputStream = this.getClass()
+ .getClassLoader()
+ .getResourceAsStream("yaml/customer_with_type.yaml");
+ Customer customer = yaml.load(inputStream);
+ assertEquals("John", customer.getFirstName());
+ assertEquals("Doe", customer.getLastName());
+ assertEquals(20, customer.getAge());
+ }
+
+ @Test
+ public void whenLoadYAML_thenLoadCorrectImplicitTypes() {
+ Yaml yaml = new Yaml();
+ Map