diff --git a/core-java/jackson/jackson/.gitignore b/core-java/jackson/jackson/.gitignore
new file mode 100644
index 0000000..3aff996
--- /dev/null
+++ b/core-java/jackson/jackson/.gitignore
@@ -0,0 +1,29 @@
+HELP.md
+target/*
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
\ No newline at end of file
diff --git a/core-java/jackson/jackson/pom.xml b/core-java/jackson/jackson/pom.xml
new file mode 100644
index 0000000..39398c4
--- /dev/null
+++ b/core-java/jackson/jackson/pom.xml
@@ -0,0 +1,52 @@
+
+
+ 4.0.0
+
+ com.reflectoring
+ jackson
+ 1.0-SNAPSHOT
+
+
+ 11
+ 11
+
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.13.3
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-jsr310
+ 2.13.3
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.9.0-M1
+ test
+
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+ provided
+
+
+
+ org.assertj
+ assertj-core
+ 3.23.1
+ test
+
+
+
+
+
\ No newline at end of file
diff --git a/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Car.java b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Car.java
new file mode 100644
index 0000000..82670d5
--- /dev/null
+++ b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Car.java
@@ -0,0 +1,24 @@
+package com.reflectoring.pojo;
+
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+public class Car {
+ @JsonSetter("carBrand")
+ private String brand;
+ private Map unrecognizedFields = new HashMap<>();
+
+ @JsonAnySetter
+ public void allSetter(String fieldName, String fieldValue) {
+ unrecognizedFields.put(fieldName, fieldValue);
+ }
+}
diff --git a/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Cat.java b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Cat.java
new file mode 100644
index 0000000..9dc27bf
--- /dev/null
+++ b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Cat.java
@@ -0,0 +1,29 @@
+package com.reflectoring.pojo;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonGetter;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+
+@NoArgsConstructor
+@AllArgsConstructor
+public class Cat {
+ private String name;
+
+ @JsonAnyGetter
+ Map map = Map.of(
+ "name", "Jack",
+ "surname", "wolfskin"
+ );
+
+ @JsonGetter("catName")
+ public String getName() {
+ return name;
+ }
+
+ public Cat(String name) {
+ this.name = name;
+ }
+}
diff --git a/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Dog.java b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Dog.java
new file mode 100644
index 0000000..6b8c0de
--- /dev/null
+++ b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Dog.java
@@ -0,0 +1,15 @@
+package com.reflectoring.pojo;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Getter
+public class Dog {
+ private String name;
+ @JsonIgnore
+ private Integer age;
+}
diff --git a/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Employee.java b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Employee.java
new file mode 100644
index 0000000..344264d
--- /dev/null
+++ b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Employee.java
@@ -0,0 +1,16 @@
+package com.reflectoring.pojo;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Getter
+@AllArgsConstructor
+@NoArgsConstructor
+public class Employee {
+ private String firstName;
+ private String lastName;
+ private int age;
+}
diff --git a/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Order.java b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Order.java
new file mode 100644
index 0000000..80c8abe
--- /dev/null
+++ b/core-java/jackson/jackson/src/main/java/com/reflectoring/pojo/Order.java
@@ -0,0 +1,18 @@
+package com.reflectoring.pojo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonSetter;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDate;
+
+@NoArgsConstructor
+@AllArgsConstructor
+@Getter
+public class Order {
+ private int id;
+ @JsonFormat(pattern = "dd/MM/yyyy")
+ private LocalDate date;
+}
diff --git a/core-java/jackson/jackson/src/test/java/com/reflectoring/JacksonTest.java b/core-java/jackson/jackson/src/test/java/com/reflectoring/JacksonTest.java
new file mode 100644
index 0000000..2c46bcd
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/java/com/reflectoring/JacksonTest.java
@@ -0,0 +1,184 @@
+package com.reflectoring;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.reflectoring.pojo.*;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class JacksonTest {
+ ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules();
+
+ @Test
+ void jsonStringToPojo() throws JsonProcessingException {
+ String employeeJson = "{\n" +
+ " \"firstName\" : \"Jalil\",\n" +
+ " \"lastName\" : \"Jarjanazy\",\n" +
+ " \"age\" : 30\n" +
+ "}";
+
+ Employee employee = objectMapper.readValue(employeeJson, Employee.class);
+
+ assertThat(employee.getFirstName()).isEqualTo("Jalil");
+ }
+
+ @Test
+ void pojoToJsonString() throws JsonProcessingException {
+ Employee employee = new Employee("Mark", "James", 20);
+
+ String json = objectMapper.writeValueAsString(employee);
+
+ assertThat(json).isEqualTo("{\"firstName\":\"Mark\",\"lastName\":\"James\",\"age\":20}");
+ }
+
+ @Test
+ void jsonFileToPojo() throws IOException {
+ File file = new File("src/test/resources/employee.json");
+
+ Employee employee = objectMapper.readValue(file, Employee.class);
+
+ assertThat(employee.getAge()).isEqualTo(44);
+ assertThat(employee.getLastName()).isEqualTo("Simpson");
+ assertThat(employee.getFirstName()).isEqualTo("Homer");
+ }
+
+ @Test
+ void byteArrayToPojo() throws IOException {
+ String employeeJson = "{\n" +
+ " \"firstName\" : \"Jalil\",\n" +
+ " \"lastName\" : \"Jarjanazy\",\n" +
+ " \"age\" : 30\n" +
+ "}";
+
+ Employee employee = objectMapper.readValue(employeeJson.getBytes(), Employee.class);
+
+ assertThat(employee.getFirstName()).isEqualTo("Jalil");
+ }
+
+ @Test
+ void fileToListOfPojos() throws IOException {
+ File file = new File("src/test/resources/employeeList.json");
+ List employeeList = objectMapper.readValue(file, new TypeReference<>(){});
+
+ assertThat(employeeList).hasSize(2);
+ assertThat(employeeList.get(0).getAge()).isEqualTo(33);
+ assertThat(employeeList.get(0).getLastName()).isEqualTo("Simpson");
+ assertThat(employeeList.get(0).getFirstName()).isEqualTo("Marge");
+ }
+
+ @Test
+ void fileToMap() throws IOException {
+ File file = new File("src/test/resources/employee.json");
+ Map employee = objectMapper.readValue(file, new TypeReference<>(){});
+
+ assertThat(employee.keySet()).containsExactly("firstName", "lastName", "age");
+
+ assertThat(employee.get("firstName")).isEqualTo("Homer");
+ assertThat(employee.get("lastName")).isEqualTo("Simpson");
+ assertThat(employee.get("age")).isEqualTo(44);
+ }
+
+ @Test
+ void fileToPojoWithUnknownProperties() throws IOException {
+ File file = new File("src/test/resources/employeeWithUnknownProperties.json");
+
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+ Employee employee = objectMapper.readValue(file, Employee.class);
+
+ assertThat(employee.getFirstName()).isEqualTo("Homer");
+ assertThat(employee.getLastName()).isEqualTo("Simpson");
+ assertThat(employee.getAge()).isEqualTo(44);
+ }
+
+ @Test
+ void orderToJson() throws JsonProcessingException {
+ Order order = new Order(1, LocalDate.of(1900,2,1));
+
+ String json = objectMapper.writeValueAsString(order);
+
+ System.out.println(json);
+ }
+
+ @Test
+ void orderToJsonWithDate() throws JsonProcessingException {
+ Order order = new Order(1, LocalDate.of(2023, 1, 1));
+
+ String json = objectMapper.writeValueAsString(order);
+
+ System.out.println(json);
+ }
+ @Test
+ void fileToOrder() throws IOException {
+ File file = new File("src/test/resources/order.json");
+
+ Order order = objectMapper.readValue(file, Order.class);
+
+ assertThat(order.getDate().getYear()).isEqualTo(2000);
+ assertThat(order.getDate().getMonthValue()).isEqualTo(4);
+ assertThat(order.getDate().getDayOfMonth()).isEqualTo(30);
+ }
+ @Test
+ void fileToCar() throws IOException {
+ File file = new File("src/test/resources/car.json");
+
+ Car car = objectMapper.readValue(file, Car.class);
+
+ assertThat(car.getBrand()).isEqualTo("BMW");
+ }
+
+ @Test
+ void fileToUnrecognizedCar() throws IOException {
+ File file = new File("src/test/resources/carUnrecognized.json");
+
+ Car car = objectMapper.readValue(file, Car.class);
+
+ assertThat(car.getUnrecognizedFields()).containsKey("productionYear");
+ }
+
+ @Test
+ void catToJson() throws JsonProcessingException {
+ Cat cat = new Cat("Monica");
+
+ String json = objectMapper.writeValueAsString(cat);
+
+ System.out.println(json);
+
+ }
+
+ @Test
+ void catToJsonWithMap() throws JsonProcessingException {
+ Cat cat = new Cat("Monica");
+
+ String json = objectMapper.writeValueAsString(cat);
+
+ System.out.println(json);
+ }
+
+ @Test
+ void dogToJson() throws JsonProcessingException {
+ Dog dog = new Dog("Max", 3);
+
+ String json = objectMapper.writeValueAsString(dog);
+
+ System.out.println(json);
+ }
+ @Test
+ void fileToDog() throws IOException {
+ File file = new File("src/test/resources/dog.json");
+
+ Dog dog = objectMapper.readValue(file, Dog.class);
+
+ assertThat(dog.getName()).isEqualTo("bobby");
+ assertThat(dog.getAge()).isNull();
+ }
+}
diff --git a/core-java/jackson/jackson/src/test/resources/car.json b/core-java/jackson/jackson/src/test/resources/car.json
new file mode 100644
index 0000000..4f231d6
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/resources/car.json
@@ -0,0 +1,3 @@
+{
+ "carBrand" : "BMW"
+}
\ No newline at end of file
diff --git a/core-java/jackson/jackson/src/test/resources/carUnrecognized.json b/core-java/jackson/jackson/src/test/resources/carUnrecognized.json
new file mode 100644
index 0000000..70a0dc0
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/resources/carUnrecognized.json
@@ -0,0 +1,4 @@
+{
+ "carBrand" : "BMW",
+ "productionYear": 1996
+}
\ No newline at end of file
diff --git a/core-java/jackson/jackson/src/test/resources/dog.json b/core-java/jackson/jackson/src/test/resources/dog.json
new file mode 100644
index 0000000..96ca22d
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/resources/dog.json
@@ -0,0 +1,4 @@
+{
+ "name" : "bobby",
+ "age" : 5
+}
\ No newline at end of file
diff --git a/core-java/jackson/jackson/src/test/resources/employee.json b/core-java/jackson/jackson/src/test/resources/employee.json
new file mode 100644
index 0000000..15cda00
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/resources/employee.json
@@ -0,0 +1,5 @@
+{
+ "firstName":"Homer",
+ "lastName":"Simpson",
+ "age":44
+}
diff --git a/core-java/jackson/jackson/src/test/resources/employeeList.json b/core-java/jackson/jackson/src/test/resources/employeeList.json
new file mode 100644
index 0000000..5a05a3b
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/resources/employeeList.json
@@ -0,0 +1,12 @@
+[
+ {
+ "firstName":"Marge",
+ "lastName":"Simpson",
+ "age":33
+ },
+ {
+ "firstName":"Homer",
+ "lastName":"Simpson",
+ "age":44
+ }
+]
diff --git a/core-java/jackson/jackson/src/test/resources/employeeWithUnknownProperties.json b/core-java/jackson/jackson/src/test/resources/employeeWithUnknownProperties.json
new file mode 100644
index 0000000..8778b11
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/resources/employeeWithUnknownProperties.json
@@ -0,0 +1,6 @@
+{
+ "firstName":"Homer",
+ "lastName":"Simpson",
+ "age":44,
+ "department": "IT"
+}
diff --git a/core-java/jackson/jackson/src/test/resources/order.json b/core-java/jackson/jackson/src/test/resources/order.json
new file mode 100644
index 0000000..8d94ba9
--- /dev/null
+++ b/core-java/jackson/jackson/src/test/resources/order.json
@@ -0,0 +1,4 @@
+{
+ "id" : 1,
+ "date" : "30/04/2000"
+}
\ No newline at end of file