logo

Анотації серіалізації в Jackson

Серіалізація анотації використовуються, коли ми серіалізуємо об’єкти Java у рядок Json. Бібліотека Джексона надає кілька анотацій серіалізації, наприклад @JsonSerialize, @JacksonGetter, @JsonAnyGetter і т.д.

Анотації серіалізації в Jackson

Давайте розберемося в кожному з них окремо на прикладі.

@JsonAnyGetter

@JsonAnyGetter є однією з найважливіших анотацій, які використовуються для серіалізації додаткових властивостей JSON так само, як серіалізуються інші властивості. Анотація дозволяє методу отримання для повернення карти, яку ми потім використовували для серіалізації. Анотація JsonAnyGetter використовується для серіалізації, що означає, що вона відноситься до категорії Анотація серіалізації .

Давайте візьмемо два приклади, щоб зрозуміти @JsonAnyGetter анотація. У першому прикладі ми перетворимо Java Object на JSON без використання анотації. У другому прикладі ми робимо це за допомогою анотації, щоб зрозуміти використання анотації @JsonAnyGetter.

JsonAnyGetterExample1.java

 // import required classes and package import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import com.fasterxml.jackson.databind.ObjectMapper; // create class JsonAnyGetterExample1 public class JsonAnyGetterExample1 { // main() method start public static void main(String args[]){ // create instance of ObjectMapper class ObjectMapper mapper = new ObjectMapper(); // create Scanner class object Scanner sc= new Scanner(System.in); try{ Faculty faculty = new Faculty(); String facId, facname, facEmail; System.out.println('Enter Faculty Id:'); facId = sc.nextLine(); faculty.add('Id', facId); System.out.println('Enter Faculty Name'); facname = sc.nextLine(); faculty.add('Name', facname); System.out.println('Enter Faculty Email'); facEmail = sc.nextLine(); faculty.add('Email', facEmail); // convert Java type into Json string String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(faculty); System.out.println(jsonString); } catch (IOException e) { e.printStackTrace(); } // close Scanner class object sc.close(); } } class Faculty { private Map facultyData; public Faculty(){ facultyData = new HashMap(); } public Map getFacultyData(){ return facultyData; } public void add(String key, String value){ facultyData.put(key, value); } } 

Вихід:

Анотації серіалізації в Jackson

JsonAnyGetterExample2.java

 // import required classes and package import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Scanner; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.databind.ObjectMapper; // create class JsonAnyGetterExample2 to understand use of @JsonAnyGetter public class JsonAnyGetterExample2 { // main() method start public static void main(String args[]){ // create instance of ObjectMapper class ObjectMapper mapper = new ObjectMapper(); // create Scanner class object Scanner sc= new Scanner(System.in); try{ Faculty faculty = new Faculty(); String facId, facname, facEmail; System.out.println('Enter Faculty Id:'); facId = sc.nextLine(); faculty.add('Id', facId); System.out.println('Enter Faculty Name'); facname = sc.nextLine(); faculty.add('Name', facname); System.out.println('Enter Faculty Email'); facEmail = sc.nextLine(); faculty.add('Email', facEmail); // convert Java type into Json string String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(faculty); System.out.println(jsonString); } catch (IOException e) { e.printStackTrace(); } // close Scanner class object sc.close(); } } class Faculty { private Map facultyData; public Faculty(){ facultyData = new HashMap(); } @JsonAnyGetter public Map getFacultyData(){ return facultyData; } public void add(String key, String value){ facultyData.put(key, value); } } 

Вихід:

Анотації серіалізації в Jackson

Пояснення:

Вихід поставляється з a FacultyData у першому прикладі, оскільки ми не використовуємо анотацію @JsonAnyGetter. У другому прикладі вихідні дані містять лише значення Id, Name та Email. У вихідних даних немає заголовка facultyData, оскільки ми використовуємо @JsonAnyGetter анотація там.

двозв'язаний список

@JsonGetter

@JsonGetter це ще одна найважливіша анотація, яка використовується для серіалізації додаткових властивостей JSON. Це схоже на анотацію @JsonProperty, яка дозволяє позначати певний метод як метод отримання. Анотація @JsonGetter також використовується для серіалізації, тому вона входить Анотація серіалізації .

Давайте візьмемо два приклади, щоб зрозуміти @JsonGetter анотація. У першому прикладі ми перетворимо Java Object на JSON без використання анотації. У другому прикладі ми робимо це за допомогою анотації, щоб зрозуміти використання анотації @JsonGetter.

JsonGetterExample1.java

 //import required classes and package import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.databind.ObjectMapper; //create class JsonGetterExample1 public class JsonGetterExample1 { // main() method start public static void main(String args[]){ // create instance of ObjectMapper class ObjectMapper mapper = new ObjectMapper(); // create Scanner class object Scanner sc= new Scanner(System.in); try{ String facId, facName, facEmail; System.out.println('Enter Faculty Id:'); facId = sc.nextLine(); System.out.println('Enter Faculty Name'); facName = sc.nextLine(); System.out.println('Enter Faculty Email'); facEmail = sc.nextLine(); FacultyNew faculty = new FacultyNew(facId, facName, facEmail); // convert Java type into Json string String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(faculty); System.out.println(jsonString); } catch (IOException e) { e.printStackTrace(); } // close Scanner class object sc.close(); } } class FacultyNew { private String facId; private String facName; private String facEmail; public FacultyNew(String id, String name, String email){ facId = id; facName = name; facEmail = email; } public String getId(){ return facId; } public String getName(){ return facName; } public String getEmail(){ return facEmail; } } 

Вихід:

Анотації серіалізації в Jackson

JsonGetterExample2.java

 //import required classes and package import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.annotation.JsonGetter; import com.fasterxml.jackson.databind.ObjectMapper; //create class JsonGetterExample2 to understand the JsonGetter annotation public class JsonGetterExample2 { // main() method start public static void main(String args[]){ // create instance of ObjectMapper class ObjectMapper mapper = new ObjectMapper(); // create Scanner class object Scanner sc= new Scanner(System.in); try{ String facId, facName, facEmail; System.out.println('Enter Faculty Id:'); facId = sc.nextLine(); System.out.println('Enter Faculty Name'); facName = sc.nextLine(); System.out.println('Enter Faculty Email'); facEmail = sc.nextLine(); FacultyNew faculty = new FacultyNew(facId, facName, facEmail); // convert Java type into Json string String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(faculty); System.out.println(jsonString); } catch (IOException e) { e.printStackTrace(); } // close Scanner class object sc.close(); } } class FacultyNew { private String id; private String name; private String email; public FacultyNew(String id, String name, String email){ this.id = id; this.name = name; this.email = email; } public String getFacultyId(){ return id; } @JsonGetter('name') public String getFacultyName(){ return name; } public String getFacultyEmail(){ return email; } } 

Вихід:

Анотації серіалізації в Jackson

Пояснення

У першому прикладі кожна назва змінної починається з префікса факультету, оскільки ми не використовуємо анотацію @JsonGetter. Імена змінних починаються без значень префікса (факультет) у другому прикладі.

@JsonPropertyOrder

@JsonPropertyOrder є ще однією важливою анотацією Джексона. Він використовується для збереження певного порядку під час серіалізації об’єкта JSON. Він також використовується для серіалізації, тому він також входить Анотація серіалізації .

Давайте візьмемо два приклади, щоб зрозуміти @JsonPropertyOrder анотація. Логіка та функціональність обох кодів схожі. Єдина відмінність між ними полягає в тому, що в першому коді ми не використовуємо @JsonPropertyOrder, а в другому ми використовуємо його.

JsonPropertyOrderExample1.java

 import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; // create JsonPropertyOrderExample1 class to convert Java Object into JSON public class JsonPropertyOrderExample1 { // main() method start public static void main(String args[]){ // create instance of the ObjectSerialization class ObjectMapper obj = new ObjectMapper(); Scanner sc1 = new Scanner(System.in); try { Product prod = new Product(); String prodId, prodName, price; System.out.println('Enter Product Id:'); prodId = sc1.nextLine(); prod.setProId(prodId); System.out.println('Enter Product Name'); prodName = sc1.nextLine(); prod.setProName(prodName); System.out.println('Enter Product Price:'); price = sc1.nextLine(); prod.setPrice(price); String jsonString = obj .writerWithDefaultPrettyPrinter() .writeValueAsString(prod); System.out.println(jsonString); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // close scanner class object sc1.close(); } } class Product { //Creating properties of Product class private String proId; private String name; private String price; //Getter and Setters public String getProId() { return proId; } public void setProId(String proId) { this.proId = proId; } public String getName() { return name; } public void setProName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } @Override public String toString() { // TODO Auto-generated method stub return ''Product [ProductId '+ proId + ', ProductName = ' + name + ', ProductPrice = ' + price + ']'; } } 

Вихід:

Анотації серіалізації в Jackson

JsonPropertyOrderExample2.java

 import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; // create JsonPropertyOrderExample1 class to convert Java Object into JSON public class JsonPropertyOrderExample1 { // main() method start public static void main(String args[]){ // create instance of the ObjectSerialization class ObjectMapper obj = new ObjectMapper(); Scanner sc1 = new Scanner(System.in); try { Product prod = new Product(); String prodId, prodName, price; System.out.println('Enter Product Id:'); prodId = sc1.nextLine(); prod.setProId(prodId); System.out.println('Enter Product Name'); prodName = sc1.nextLine(); prod.setProName(prodName); System.out.println('Enter Product Price:'); price = sc1.nextLine(); prod.setPrice(price); String jsonString = obj .writerWithDefaultPrettyPrinter() .writeValueAsString(prod); System.out.println(jsonString); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // close scanner class object sc1.close(); } } @JsonPropertyOrder({'name', 'proId'}) class Product { //Creating properties of Product class private String proId; private String name; private String price; //Getter and Setters public String getProId() { return proId; } public void setProId(String proId) { this.proId = proId; } public String getName() { return name; } public void setProName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } @Override public String toString() { // TODO Auto-generated method stub return ''Product [ProductId '+ proId + ', ProductName = ' + name + ', ProductPrice = ' + price + ']'; } } 

Вихід:

альтернативи watchcartoononline.io
Анотації серіалізації в Jackson

Пояснення

У першому прикладі вивід надається з порядком полів за замовчуванням, оскільки ми не використовуємо @JsonPropertyOrder . У другому прикладі вихідні дані надходять із порядком полів, які ми визначаємо @JsonPropertyOrder . Отже, анотація JsonProprtyOrder використовується для отримання поля результату у вказаному порядку.

@JsonRawValue

@JsonRawValue є ще однією важливою анотацією Джексона, яка використовується для серіалізації об’єкта. Він використовується для серіалізації тексту без екранування або без будь-яких прикрас. Це також входить Анотація серіалізації с.

Давайте розберемо приклади, щоб зрозуміти використання @JsonRawValue анотація, в якій ми пишемо код з і без @JsonRawValue анотація.

JsonRawValueExample1.java

 import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; // create JsonRawValueExample1 class to convert Java Object into JSON public class JsonRawValueExample1 { // main() method start public static void main(String args[]){ // create instance of the ObjectSerialization class ObjectMapper obj = new ObjectMapper(); Scanner sc1 = new Scanner(System.in); try { Product prod = new Product(); String prodId, prodName, price; System.out.println('Enter Product Id:'); prodId = sc1.nextLine(); prod.setProId(prodId); System.out.println('Enter Product Name'); prodName = sc1.nextLine(); prod.setProName(prodName); System.out.println('Enter Product Price:'); price = sc1.nextLine(); prod.setPrice(price); prod.setJson('{'attr':false}'); String jsonString = obj .writerWithDefaultPrettyPrinter() .writeValueAsString(prod); System.out.println(jsonString); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // close scanner class object sc1.close(); } } class Product { //Creating properties of Product class private String proId; private String name; private String price; private String json; //Getter and Setters public String getProId() { return proId; } public void setProId(String proId) { this.proId = proId; } public String getName() { return name; } public void setProName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getJson() { return json; } public void setJson(String json) { this.json = json; } @Override public String toString() { // TODO Auto-generated method stub return ''Product [ProductId '+ proId + ', ProductName = ' + name + ', ProductPrice = ' + price + ']'; } } 

Вихід:

Анотації серіалізації в Jackson

JsonRawValueExample2.java

 import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonRawValue; // create JsonRawValueExample2 class to convert Java Object into JSON public class JsonRawValueExample2 { // main() method start public static void main(String args[]){ // create instance of the ObjectSerialization class ObjectMapper obj = new ObjectMapper(); Scanner sc1 = new Scanner(System.in); try { Product prod = new Product(); String prodId, prodName, price; System.out.println('Enter Product Id:'); prodId = sc1.nextLine(); prod.setProId(prodId); System.out.println('Enter Product Name'); prodName = sc1.nextLine(); prod.setProName(prodName); System.out.println('Enter Product Price:'); price = sc1.nextLine(); prod.setPrice(price); prod.setJson('{'attr':false}'); String jsonString = obj .writerWithDefaultPrettyPrinter() .writeValueAsString(prod); System.out.println(jsonString); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // close scanner class object sc1.close(); } } class Product { //Creating properties of Product class private String proId; private String name; private String price; @JsonRawValue private String json; //Getter and Setters public String getProId() { return proId; } public void setProId(String proId) { this.proId = proId; } public String getName() { return name; } public void setProName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getJson() { return json; } public void setJson(String json) { this.json = json; } @Override public String toString() { // TODO Auto-generated method stub return ''Product [ProductId '+ proId + ', ProductName = ' + name + ', ProductPrice = ' + price + ']'; } } 

Вихід:

Анотації серіалізації в Jackson

Пояснення

У першому прикладі значення поля json має прикрасу, оскільки ми не використовуємо @JsonRawValue анотація. Тоді як у другому прикладі значення поля json надходить без екранування чи декорування, оскільки ми використовуємо @JsonRawValue анотація. Отже, значення вводяться без косої риски (/).

@JsonValue

@JsonValue це одна з найбільш використовуваних і найважливіших анотацій, яка використовується для серіалізації окремого об’єкта за допомогою його єдиного методу.

Розглянемо приклад, щоб зрозуміти, як анотація використовується для серіалізації об’єкта:

JsonValueExample1.java

 import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.annotation.JsonValue; // create JsonValueExample class to serialize an object using its single method public class JsonValueExample { // main() method start public static void main(String args[]){ // create instance of the ObjectSerialization class ObjectMapper obj = new ObjectMapper(); Scanner sc1 = new Scanner(System.in); try { Product prod = new Product(); String prodId, prodName, price; System.out.println('Enter Product Id:'); prodId = sc1.nextLine(); prod.setProId(prodId); System.out.println('Enter Product Name'); prodName = sc1.nextLine(); prod.setProName(prodName); System.out.println('Enter Product Price:'); price = sc1.nextLine(); prod.setPrice(price); String jsonString = obj .writerWithDefaultPrettyPrinter() .writeValueAsString(prod); System.out.println(jsonString); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // close scanner class object sc1.close(); } } class Product { //Creating properties of Product class private String proId; private String name; private String price; //Getter and Setters public String getProId() { return proId; } public void setProId(String proId) { this.proId = proId; } public String getName() { return name; } public void setProName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } @JsonValue public String toString() { // TODO Auto-generated method stub return '{ ProductId = '+ proId + ', ProductName = ' + name + ', ProductPrice = ' + price + '}'; } } 

Вихід:

Анотації серіалізації в Jackson

@JsonRootName

@JsonRootName анотація — це одна з найважливіших анотацій, яка використовується для вказівки назви POJO, яка має бути серіалізована. Простими словами, він використовується для обгортання об’єкта для серіалізації з елементом верхнього рівня. Він також відноситься до категорії Анотація серіалізації .

Ми передаємо назву як параметр до анотації. Ми також використовуємо 'WRAP_ROOT_VALUE' , тобто функція переліку SerializationFeature. Ми вмикаємо його для обгортання значення маршруту в одному об’єкті властивості JSON, де ключем є назва маршруту.

Візьмемо приклад @JsonRootName щоб зрозуміти, як це працює:

JsonRootNameExample.java

 import java.io.IOException; import java.util.Scanner; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.annotation.JsonRootName; // create JsonRootNameExample class to serialize an object public class JsonRootNameExample { // main() method start public static void main(String args[]){ // create instance of the ObjectSerialization class ObjectMapper obj = new ObjectMapper(); Scanner sc1 = new Scanner(System.in); try { Product prod = new Product(); String prodId, prodName, price; System.out.println('Enter Product Id:'); prodId = sc1.nextLine(); prod.setProId(prodId); System.out.println('Enter Product Name'); prodName = sc1.nextLine(); prod.setProName(prodName); System.out.println('Enter Product Price:'); price = sc1.nextLine(); prod.setPrice(price); String jsonString = obj. enable(SerializationFeature.WRAP_ROOT_VALUE) .writerWithDefaultPrettyPrinter() .writeValueAsString(prod); System.out.println(jsonString); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } // close scanner class object sc1.close(); } } @JsonRootName(value = 'Details') class Product { //Creating properties of Product class private String proId; private String name; private String price; //Getter and Setters public String getProId() { return proId; } public void setProId(String proId) { this.proId = proId; } public String getName() { return name; } public void setProName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } @Override public String toString() { // TODO Auto-generated method stub return ''Product [ProductId '+ proId + ', ProductName = ' + name + ', ProductPrice = ' + price + ']'; } } 

Вихід:

Анотації серіалізації в Jackson

@JsonSerialize

@JsonSerialize є однією з найбільш використовуваних анотацій під час серіалізації об’єкта Java. Він використовується для визначення спеціального серіалізатора для маршалінгу об’єкта Json.

Розглянемо приклад, щоб зрозуміти, як це допомагає серіалізувати об’єкт.

JsonSerializerExample.java

 import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.databind.ser.std.StdSerializer; // create class JsonSerializeExample to understand how we can use custom specific serializer public class JsonSerializeExample { //main method start public static void main(String args[]) throws ParseException { // create instance of the ObjectSerialization class ObjectMapper obj = new ObjectMapper(); // create instance of SimpleDateFormat class to format a date SimpleDateFormat sdf = new SimpleDateFormat('dd-MM-yyyy'); Scanner sc1 = new Scanner(System.in); try { Product prod = new Product(); String prodId, prodName, price; Date exp; System.out.println('Enter Product Id:'); prodId = sc1.nextLine(); prod.setProId(prodId); System.out.println('Enter Product Name'); prodName = sc1.nextLine(); prod.setProName(prodName); System.out.println('Enter Product Price:'); price = sc1.nextLine(); prod.setPrice(price); System.out.println('Enter expiry date of product in dd-MM-yyyy format:'); exp = sdf.parse(sc1.nextLine()); prod.setDate(exp); String jsonString = obj .writerWithDefaultPrettyPrinter() .writeValueAsString(prod); System.out.println(jsonString); } catch (JsonParseException e) { e.printStackTrace(); } catch (JsonMappingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } // create class Product class Product { //Creating properties of Product class private String proId; private String name; private String price; @JsonSerialize(using = DateSerializer.class) private Date expire; //Getter and Setters public String getProId() { return proId; } public void setProId(String proId) { this.proId = proId; } public String getName() { return name; } public void setProName(String name) { this.name = name; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public Date getDate() { return expire; } public void setDate(Date expire) { this.expire = expire; } } // create custom serializer by extending StdSerializer class DateSerializer extends StdSerializer { // declare and initialize serialVersionUID private static final long serialVersionUID = 1L; private static SimpleDateFormat sdf = new SimpleDateFormat('dd-MM-yyyy'); // default and parameterized constructor public DateSerializer() { this(null); } public DateSerializer(Class t) { super(t); } // override serialize method @Override public void serialize(Date d1, JsonGenerator jsonGen, SerializerProvider serializer) throws IOException { jsonGen.writeString(sdf.format(d1)); } } 

Вихід:

Анотації серіалізації в Jackson