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