"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.
„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:”
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);
}
@JsonAutoDetect
class Cat
{
public String name;
public int age;
public int weight;
Cat(){}
}
{"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:”
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);
}
@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:”
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);
}
@JsonAutoDetect
class Cat
{
@JsonProperty("alias")
public String name;
public int age;
@JsonIgnore
public int weight;
Cat() {
}
}
{"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.
GO TO FULL VERSION