"Bună, Amigo!"

— Bună, Ellie!

„Din moment ce ați fost deja prezentat în JSON, să vorbim mai multe despre asta astăzi.”

"OK. Unde este folosit de obicei?"

„Iată cum funcționează de obicei. Cineva (clientul) solicită date de la un program Java (server). Programul creează obiecte Java și le umple cu informații din baza de date. Apoi le convertește într-un format pe care solicitantul (clientul) ) poate înțelege, cum ar fi JSON, și le trimite înapoi."

„Permiteți-mi să vă spun cum să lucrați cu JSON în Java. În esență, trebuie să facem doar două lucruri: serializarea obiectelor Java în format JSON și deserializarea obiectelor Java din formatul JSON.”

"Cu alte cuvinte, JSON este un standard pentru trimiterea de mesaje/date de la un program la altul. Există o mulțime de standarde de acest fel. Dar dacă programul este scris în JavaScript, de obicei încearcă să folosească JSON."

"OK sunt gata."

— Minunat. Atunci hai să începem.

Serializare în JSON - 1

„După cum știți deja, Java are încorporate instrumente standard de serializare. Dar acestea nu acceptă JSON. Deci, dacă trebuie să serializați un obiect în JSON, puteți utiliza unul dintre cadrele (bibliotecile) populare care știu cum să fa asta."

„Care este diferența dintre aceste cadre diferite?”

"De obicei diferă în ceea ce privește nivelul lor de complexitate: există cadre care pot face doar elementele de bază, dar sunt foarte mici și simple. Și există cadre complexe mari care pot face mult mai mult."

„Jackson este unul dintre cele mai populare framework-uri. Îl vom folosi ca exemplu când ne uităm la cum să lucrăm cu JSON.”

„În primul rând, trebuie să descărcați acest cadru și să-l adăugați la proiectul dumneavoastră. Trebuie să faceți acest lucru direct în IntelliJ IDEA. Puteți descărca cadrul utilizând acest link .”

"Terminat."

— Grozav. Atunci hai să continuăm.

„Conversia unui obiect Java în JSON este la fel de ușoară ca și serializarea lui. Pentru a face acest lucru, există o clasă specială ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper).”

„Permiteți-mi să vă arăt un exemplu de lucru și apoi îl vom analiza:”

Convertiți un obiect în 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);
}
O clasă Cat ale cărei obiecte se convertesc în JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Rezultatul serializării și rezultatul ecranului:
{"name":"Missy", "age":5, "weight":4}

"Iată cum funcționează:"

„În rândurile 4-7, creăm un obiect Cat și îl populăm cu date.”

„În linia 10, creăm un obiect Writer în care vom scrie o reprezentare JSON a obiectului.”

„În linia 13, creăm un obiect ObjectMapper care va efectua toată serializarea.”

„În linia 16, scriem reprezentarea JSON a obiectului pisică în scriitor .”

„În rândurile 19-20, afișăm rezultatul pe ecran”.

„Totul pare destul de simplu. Nu mai greu decât serializarea nativă în Java.”

„Cum ar arăta deserializarea?”

„Este aproape la fel, doar mai scurt:”

Convertiți un obiect din 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);
}
O clasă ale cărei obiecte sunt deserializate din format JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

„Este și mai ușor. Luăm ObjectMapper și îi pasăm un șir de caractere sau un StringReader cu JSON, precum și clasa obiectului de deserializat . Apoi apelăm metoda readValue și ca rezultat obținem un obiect Java gata făcut cu toate datele.”

„Ei bine, este exact ca deserializarea în Java.”

„Aproape. Există mai multe cerințe impuse obiectelor serializate în, sau deserializate din, JSON:”

1)  câmpurile trebuie să fie vizibile: fie trebuie să fie publice, fie să aibă getters și setters”

" 2)  trebuie să existe un constructor implicit (unul fără parametri)"

— Înțeleg. Nu este prea surprinzător. Dar Java a serializat totul, chiar și câmpurile private.

"Ei bine, asta a fost Java. Are acces la date ascunse. Nu te poți ascunde de tine."

"Există un al treilea aspect aici. Sper că ai observat adnotarea @JsonAutoDetect pe clasa Cat?"

"Da. Eram pe punctul de a întreba ce este."

„Este o adnotare: informații de întreținere pentru cadrul Jackson. Folosind adnotările potrivite, aveți un control destul de flexibil asupra rezultatelor serializării în JSON.”

"Cool! Ce fel de adnotări există?"

„Iată câteva exemple:”

Adnotare Descriere
@JsonAutoDetect Plasat înaintea unei clase.
Marchează o clasă ca gata pentru a fi serializată în JSON.
@JsonIgnore Amplasat înaintea unei proprietăți.
Proprietatea va fi ignorată în timpul serializării.
@JsonProperty Plasat înaintea unei proprietăți sau a unui getter sau setter. Vă permite să specificați un nume de câmp diferit în timpul serializării.
@JsonWriteNullProperties Plasat înaintea unei clase.
Câmpurile obiect care sunt nule nu vor fi ignorate.
@JsonPropertyOrder Plasat înaintea unei clase.
Vă permite să specificați ordinea câmpurilor în timpul serializării.

"Ce interesant! Mai sunt?"

„Sunt multe. Dar nu le vom acoperi chiar acum. Acum să reluăm ușor primul nostru exemplu:”

Convertiți un obiect în 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);
}
O clasă ale cărei obiecte se convertesc în JSON
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Rezultatul serializării și rezultatul ecranului:
{"age":5, "alias":"Missy"}

"Codul rămâne același, dar am schimbat adnotările: am specificat un alt nume pentru câmpul de nume: alias. Am marcat și câmpul de greutate ca Ignorare, ceea ce a determinat modificarea obiectului JSON."

"Este bine că poți personaliza totul așa. Cred că cu siguranță voi găsi acest lucru util."

"Și deserializarea va înțelege cum să funcționeze cu asta? Când deserializarea de la JSON la un obiect Java, valoarea câmpului alias va fi scrisă în câmpul nume al obiectului Cat?"

"Da, deserializarea va funcționa așa cum ar trebui. Este inteligentă."

— Ce să nu fii fericit atunci.

— Îți mulțumesc pentru această lecție interesantă, Ellie.