"Hei, Amigo!"

"Hei, Ellie!"

"Siden du allerede har blitt introdusert for JSON, la oss snakke mer om det i dag."

"OK. Hvor brukes den vanligvis?"

"Slik fungerer det vanligvis. Noen (klienten) ber om data fra et Java-program (serveren). Programmet lager Java-objekter og fyller dem med informasjon fra databasen. Det konverterer dem deretter til et format som rekvirenten (klienten) ) kan forstå, for eksempel JSON, og sender dem tilbake."

"La meg fortelle deg hvordan du jobber med JSON i Java. I hovedsak trenger vi bare å gjøre to ting: serialisere Java-objekter til JSON-formatet, og deserialisere Java-objekter fra JSON-formatet."

"Med andre ord, JSON er en standard for å sende meldinger/data fra ett program til et annet. Det finnes mange slike standarder. Men hvis programmet er skrevet i JavaScript, prøver det vanligvis å bruke JSON."

"Ok jeg er klar."

"Flott. Så la oss sette i gang."

Serialisering til JSON - 1

"Som du allerede vet, har Java innebygde standard serialiseringsverktøy. Men de støtter ikke JSON. Så hvis du trenger å serialisere et objekt til JSON, kan du bruke et av de populære rammeverkene (bibliotekene) som vet hvordan du gjør dette."

"Hva er forskjellen mellom disse forskjellige rammeverkene?"

"De er vanligvis forskjellige i kompleksitetsnivået: Det er rammeverk som bare kan gjøre det helt grunnleggende, men de er veldig små og enkle. Og det er store komplekse rammeverk som kan gjøre mye mer."

"Jackson er et av de mest populære rammeverkene. Vi vil bruke det som et eksempel når vi ser på hvordan man jobber med JSON."

"Først må du laste ned dette rammeverket og legge det til prosjektet ditt. Du må gjøre dette direkte i IntelliJ IDEA. Du kan laste ned rammeverket ved å bruke denne lenken ."

"Ferdig."

"Flott. La oss fortsette, da."

"Å konvertere et Java-objekt til JSON er omtrent like enkelt som å serialisere det. For å gjøre dette er det en spesiell ObjectMapper-klasse (com.fasterxml.jackson.databind.ObjectMapper)."

"La meg vise deg et fungerende eksempel, og så skal vi analysere 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 skjermutgang:
{"name":"Missy", "age":5, "weight":4}

"Slik fungerer det:"

"På linje 4-7 lager vi et Cat- objekt og fyller det med data."

"I linje 10 lager vi et Writer-objekt hvor vi skal skrive en JSON-strengrepresentasjon av objektet."

"I linje 13 lager vi et ObjectMapper- objekt som vil utføre all serialisering."

"I linje 16 skriver vi JSON-representasjonen av katteobjektet til forfatteren . "

"På linje 19-20 viser vi resultatet på skjermen."

"Alt ser ganske enkelt ut. Ikke vanskeligere enn native serialisering i Java."

"Hvordan ville deserialisering se ut?"

"Det er nesten 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 deserialisert fra JSON-format
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

"Det er enda enklere. Vi tar ObjectMapper og sender den en streng eller en StringReader med JSON, samt klassen til objektet som skal deserialiseres . Deretter kaller vi readValue- metoden, og som utdata får vi et ferdig Java-objekt med alle data."

"Vel, det er akkurat som deserialisering i Java."

"Nesten. Det stilles flere krav til objekter som er serialisert i, eller deserialisert fra, JSON:"

" 1)  feltene må være synlige: de må enten være offentlige eller ha gettere og settere"

" 2)  det må være en standard konstruktør (en uten parametere)"

"Jeg skjønner det. Det er ikke så overraskende. Men Java serieførte alt, også private felt."

"Vel, det var Java. Den har tilgang til skjulte data. Du kan ikke gjemme deg for deg selv."

"Det er et tredje aspekt her. Jeg håper du la merke til @JsonAutoDetect-kommentaren på Cat-klassen?"

"Jepp. Jeg skulle bare spørre hva det var."

"Det er en merknad: husholdningsinformasjon for Jackson-rammeverket. Ved å bruke de riktige merknadene har du ganske mye fleksibel kontroll over resultatene av serialisering til JSON."

"Kult! Hva slags merknader er det?"

"Her er noen eksempler:"

Merknad Beskrivelse
@JsonAutoDetect Plassert før en klasse.
Merker en klasse som klar til å serialiseres til JSON.
@JsonIgnorer Plassert foran en eiendom.
Eiendommen vil bli ignorert under serialisering.
@JsonProperty Plassert foran en eiendom eller en getter eller setter. Lar deg angi et annet feltnavn under serialisering.
@JsonWriteNullProperties Plassert før en klasse.
Objektfelt som er null vil ikke bli ignorert.
@JsonPropertyOrder Plassert før en klasse.
Lar deg spesifisere feltrekkefølgen under serialisering.

"Hvor interessant! Er det flere?"

"Det er mange. Men vi vil ikke dekke dem akkurat nå. La oss nå omarbeide vårt første eksempel litt:"

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 skjermutgang:
{"age":5, "alias":"Missy"}

"Koden forblir den samme, men jeg endret merknadene: Jeg spesifiserte et annet navn for navnefeltet: alias. Jeg merket også vektfeltet som Ignorer, noe som førte til at JSON-objektet endret seg."

"Det er bra at du kan tilpasse alt slik. Jeg tror jeg definitivt vil finne dette nyttig."

"Og deserialisering vil forstå hvordan man jobber med dette? Ved deserialisering fra JSON til et Java-objekt, vil verdien av aliasfeltet bli skrevet til Cat-objektets navnfelt?"

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

"Hva er det ikke å være glad for da."

"Takk for denne interessante leksjonen, Ellie."