„Здрасти, Амиго!“

„Здравей, Ели!“

„Тъй като вече се запознахте с JSON, нека поговорим повече за това днес.“

"ОК. Къде обикновено се използва?"

„Ето How обикновено работи. Някой (клиентът) изисква данни от Java програма (сървърът). Програмата създава Java обекти и ги запълва с информация от базата данни. След това ги преобразува във формат, който рикуестърът (клиентът ) може да разбере, като JSON, и ги изпраща обратно."

„Позволете ми да ви кажа How да работите с JSON в Java. По същество трябва да направим само две неща: да сериализираме Java обекти във формат JSON и да десериализираме Java обекти от JSON формат.“

"С други думи, JSON е стандарт за изпращане на съобщения/данни от една програма към друга. Има много такива стандарти. Но ако програмата е написана на JavaScript, тя обикновено се опитва да използва JSON."

"ОК. Готов съм."

"Чудесно. Тогава да започваме."

Сериализация в JSON - 1

„Както вече знаете, Java има вградени стандартни инструменти за сериализиране. Но те не поддържат JSON. Така че, ако трябва да сериализирате обект в JSON, можете да използвате една от популярните рамки (библиотеки), които знаят How да направите това."

„Каква е разликата между тези различни рамки?“

„Обикновено те се различават по нивото на сложност: има рамки, които могат да направят само основните неща, но са много малки и прости. Има и големи сложни рамки, които могат да направят много повече.“

„Jackson е една от най-популярните рамки. Ще я използваме като пример, докато разглеждаме How да работим с JSON.“

„Първо, трябва да изтеглите тази рамка и да я добавите към вашия проект. Трябва да направите това директно в IntelliJ IDEA. Можете да изтеглите рамката, като използвате тази връзка .“

"Свършен."

— Страхотно. Да продължим тогава.

„Преобразуването на Java обект в JSON е почти толкова лесно, колкото сериализирането му. За да направите това, има специален клас ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper).“

„Нека ви покажа работещ пример и след това ще го анализираме:“

Преобразувайте обект в JSON"
public static void main(String[] args) throws IOException
{
 // Create an object to be serialized into JSON
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 // Write the result of the serialization to a StringWriter
 StringWriter writer = new StringWriter();

 // This is the Jackson object that performs the serialization
 ObjectMapper mapper = new ObjectMapper();

 // And here's the serialization itself: the first argument is where, and the second is what
 mapper.writeValue(writer, cat);

 // Convert everything written to the StringWriter into a String
 String result = writer.toString();
 System.out.println(result);
}
Клас Cat, чиито обекти се конвертират в JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Резултат от сериализация и екранен изход:
{"name":"Missy", "age":5, "weight":4}

„Ето How работи:“

„В редове 4-7 създаваме обект Cat и го попълваме с данни.“

„В ред 10 създаваме обект Writer, където ще напишем JSON-низово представяне на обекта.“

„В ред 13 създаваме обект ObjectMapper , който ще извърши цялата сериализация.“

„В ред 16 записваме JSON представянето на обекта котка в writer .“

„В редове 19-20 показваме резултата на екрана.“

„Всичко изглежда доста просто. Не е по-трудно от нативната сериализация в Java.“

„Как би изглеждала десериализацията?“

„Почти същото е, само по-кратко:“

Конвертиране на обект от JSON
public static void main(String[] args) throws IOException
{
 String jsonString = "{ \"name\":\"Missy\", \"age\":5, \"weight\":4}";
 StringReader reader = new StringReader(jsonString);

 ObjectMapper mapper = new ObjectMapper();

 Cat cat = mapper.readValue(reader, Cat.class);
}
Клас, чиито обекти са десериализирани от JSON формат
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

„Още е по-лесно. Взимаме ObjectMapper и му предаваме низ or StringReader с JSON, Howто и класа на обекта, който трябва да бъде десериализиран . След това извикваме метода readValue и като изход получаваме готов Java обект с всички данни."

„Е, това е точно като десериализацията в Java.“

„Почти. Има няколко изисквания към обекти, сериализирани в or десериализирани от JSON:“

" 1)  полетата трябва да са видими: or трябва да са публични, or да имат гетери и сетери"

" 2)  трябва да има конструктор по подразбиране (без параметри)"

„Разбирам. Това не е много изненадващо. Но Java сериализира всичко, дори частните полета.“

„Е, това беше Java. Има достъп до скрити данни. Не можете да се скриете от себе си.“

„Тук има трети аспект. Надявам се, че сте забелязали анотацията @JsonAutoDetect в класа Cat?“

"Да. Тъкмо щях да попитам Howво е."

„Това е анотация: поддържаща информация за рамката Jackson. Чрез използването на правилните анотации имате доста голям гъвкав контрол върху резултатите от сериализирането в JSON.“

"Готино! Какви анотации има?"

„Ето няколко примера:“

Анотация Описание
@JsonAutoDetect Поставен пред клас.
Маркира клас като готов за сериализиране в JSON.
@JsonIgnore Поставен пред имот.
Свойството ще бъде игнорирано по време на сериализацията.
@JsonProperty Поставен преди свойство or гетер or сетер. Позволява ви да посочите различно име на поле по време на сериализация.
@JsonWriteNullProperties Поставен пред клас.
Обектни полета, които са null, няма да бъдат игнорирани.
@JsonPropertyOrder Поставен пред клас.
Позволява ви да укажете реда на полетата по време на сериализация.

"Колко интересно! Има ли още?"

„Има много. Но няма да ги разглеждаме точно сега. Сега нека преработим малко нашия първи пример:“

Преобразувайте обект в JSON
public static void main(String[] args) throws IOException
{
 Cat cat = new Cat();
 cat.name = "Missy";
 cat.age = 5;
 cat.weight = 4;

 StringWriter writer = new StringWriter();

 ObjectMapper mapper = new ObjectMapper();

 mapper.writeValue(writer, cat);

 String result = writer.toString();
 System.out.println(result);
}
Клас, чиито обекти се конвертират в JSON
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Резултат от сериализация и екранен изход:
{"age":5, "alias":"Missy"}

„Кодът остава същият, но промених анотациите: посочих друго име за полето за име: псевдоним. Освен това маркирах полето за тегло като Игнориране, което доведе до промяна на JSON обекта.“

„Хубаво е, че можете да персонализирате всичко по този начин. Мисля, че определено ще намеря това за полезно.“

"И десериализацията ще разбере How да работи с това? Когато десериализира от JSON към Java обект, стойността на полето за псевдоним ще бъде записана в полето за име на обекта Cat?"

„Да, десериализацията ще работи Howто трябва. Умно е.“

— За Howво да не се радваме тогава.

„Благодаря ти за този интересен урок, Ели.“