"Hej, Amigo!"

"Hej, Ellie!"

"Da du allerede er blevet introduceret til JSON, så lad os tale mere om det i dag."

"OK. Hvor bruges det normalt?"

"Sådan fungerer det normalt. Nogen (klienten) anmoder om data fra et Java-program (serveren). Programmet opretter Java-objekter og fylder dem med information fra databasen. Det konverterer dem derefter til et format, som rekvirenten (klienten) ) kan forstå, såsom JSON, og sender dem tilbage."

"Lad mig fortælle dig, hvordan du arbejder med JSON i Java. Grundlæggende behøver vi kun at gøre to ting: serialisere Java-objekter til JSON-formatet og deserialisere Java-objekter fra JSON-formatet."

"Med andre ord er JSON en standard for at sende beskeder/data fra et program til et andet. Der er mange standarder af den slags. Men hvis programmet er skrevet i JavaScript, forsøger det normalt at bruge JSON."

"OK. Jeg er klar."

"Fantastisk. Så lad os komme i gang."

Serialisering til JSON - 1

"Som du allerede ved, har Java indbyggede standard serialiseringsværktøjer. Men de understøtter ikke JSON. Så hvis du skal serialisere et objekt til JSON, kan du bruge et af de populære frameworks (biblioteker), der ved, hvordan man gør dette."

"Hvad er forskellen mellem disse forskellige rammer?"

"De er normalt forskellige i deres kompleksitetsniveau: Der er rammer, der kun kan det helt basale, men de er meget små og enkle. Og der er store komplekse rammer, der kan meget mere."

"Jackson er et af de mest populære rammer. Vi vil bruge det som et eksempel, når vi ser på, hvordan man arbejder med JSON."

"Først skal du downloade dette framework og tilføje det til dit projekt. Du skal gøre dette direkte i IntelliJ IDEA. Du kan downloade frameworket ved at bruge dette link ."

"Færdig."

"Fint. Lad os så fortsætte."

"At konvertere et Java-objekt til JSON er omtrent lige så nemt som at serialisere det. For at gøre dette er der en speciel ObjectMapper-klasse (com.fasterxml.jackson.databind.ObjectMapper)."

"Lad mig vise dig et fungerende eksempel, og så analyserer vi det:"

Konverter et objekt til 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);
}
En Cat-klasse, hvis objekter konverteres til JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Serialiseringsresultat og skærmoutput:
{"name":"Missy", "age":5, "weight":4}

"Sådan virker det:"

"I linje 4-7 opretter vi et Cat- objekt og udfylder det med data."

"I linje 10 opretter vi et Writer-objekt, hvor vi vil skrive en JSON-streng-repræsentation af objektet."

"I linje 13 opretter vi et ObjectMapper- objekt, der udfører hele serialiseringen."

"I linje 16 skriver vi JSON-repræsentationen af ​​katteobjektet til forfatteren . "

"I linje 19-20 viser vi resultatet på skærmen."

"Alt ser ret simpelt ud. Ikke sværere end native serialisering i Java."

"Hvordan ville deserialisering se ud?"

"Det er næsten det samme, bare kortere:"

Konverter et objekt fra 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);
}
En klasse, hvis objekter er deserialiseret fra JSON-format
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

"Det er endnu nemmere. Vi tager ObjectMapper og sender den en streng eller en StringReader med JSON, samt klassen for det objekt, der skal deserialiseres . Så kalder vi readValue- metoden, og som output får vi et færdiglavet Java-objekt med alle data."

"Nå, det er præcis ligesom deserialisering i Java."

"Næsten. Der stilles adskillige krav til objekter, der er serialiseret i eller deserialiseret fra JSON:"

" 1)  felterne skal være synlige: de skal enten være offentlige eller have gettere og sættere"

" 2)  der skal være en standardkonstruktør (en uden parametre)"

"Jeg kan se. Det er ikke så overraskende. Men Java har serieiseret alt, selv private felter."

"Nå, det var Java. Den har adgang til skjulte data. Du kan ikke gemme dig for dig selv."

"Der er et tredje aspekt her. Jeg håber, du har bemærket @JsonAutoDetect-annotationen på Cat-klassen?"

"Jep. Jeg var lige ved at spørge, hvad det var."

"Det er en annotering: husholdningsoplysninger til Jackson-rammeværket. Ved at bruge de rigtige annoteringer har du ret meget fleksibel kontrol over resultaterne af serialisering til JSON."

"Fedt! Hvilken slags anmærkninger er der?"

"Her er et par eksempler:"

Anmærkning Beskrivelse
@JsonAutoDetect Placeret før en klasse.
Markerer en klasse som klar til at blive serialiseret til JSON.
@JsonIgnorer Placeret foran en ejendom.
Egenskaben vil blive ignoreret under serialisering.
@JsonProperty Placeret foran en ejendom eller en getter eller setter. Giver dig mulighed for at angive et andet feltnavn under serialisering.
@JsonWriteNullProperties Placeret før en klasse.
Objektfelter, der er null, ignoreres ikke.
@JsonPropertyOrder Placeret før en klasse.
Giver dig mulighed for at angive feltrækkefølgen under serialisering.

"Hvor interessant! Er der flere?"

"Der er mange. Men vi vil ikke dække dem lige nu. Lad os nu omarbejde vores første eksempel lidt:"

Konverter et objekt til 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);
}
En klasse, hvis objekter konverteres til JSON
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Serialiseringsresultat og skærmoutput:
{"age":5, "alias":"Missy"}

"Koden forbliver den samme, men jeg har ændret annoteringerne: Jeg specificerede et andet navn til navnefeltet: alias. Jeg markerede også vægtfeltet som Ignorer, hvilket fik JSON-objektet til at ændre sig."

"Det er godt, at du kan tilpasse alting på den måde. Jeg tror, ​​jeg vil helt sikkert finde dette nyttigt."

"Og deserialisering vil forstå, hvordan man arbejder med dette? Når man deserialiserer fra JSON til et Java-objekt, vil værdien af ​​aliasfeltet blive skrevet til Cat-objektets navnefelt?"

"Ja, deserialisering vil fungere, som den skal. Det er smart."

"Hvad er man så ikke glad for."

"Tak for denne interessante lektion, Ellie."