"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."
"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:"
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}
"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:"
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() { }
}
"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:"
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"}
"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."
GO TO FULL VERSION