„Hallo, Amigo!“

„Hallo, Ellie!“

„Da Sie JSON bereits kennengelernt haben, lassen Sie uns heute mehr darüber sprechen.“

„OK. Wo wird es normalerweise verwendet?“

„Normalerweise funktioniert es so: Jemand (der Client) fordert Daten von einem Java-Programm (dem Server) an. Das Programm erstellt Java-Objekte und füllt sie mit Informationen aus der Datenbank. Anschließend wandelt es sie in ein Format um, das der Anforderer (der Client) anfordert ) verstehen kann, wie zum Beispiel JSON, und sendet sie zurück.“

„Lassen Sie mich Ihnen erklären, wie Sie mit JSON in Java arbeiten. Im Wesentlichen müssen wir nur zwei Dinge tun: Java-Objekte in das JSON-Format serialisieren und Java-Objekte aus dem JSON-Format deserialisieren.“

„Mit anderen Worten, JSON ist ein Standard zum Senden von Nachrichten/Daten von einem Programm an ein anderes. Es gibt viele solcher Standards. Wenn das Programm jedoch in JavaScript geschrieben ist, versucht es normalerweise, JSON zu verwenden.“

"OK ich bin bereit."

„Großartig. Dann fangen wir an.“

Serialisierung in JSON – 1

„Wie Sie bereits wissen, verfügt Java über integrierte Standard-Serialisierungstools. JSON wird jedoch nicht unterstützt. Wenn Sie also ein Objekt in JSON serialisieren müssen, können Sie eines der gängigen Frameworks (Bibliotheken) verwenden, die sich damit auskennen.“ mach das."

„Was ist der Unterschied zwischen diesen verschiedenen Frameworks?“

„Sie unterscheiden sich normalerweise in ihrem Komplexitätsgrad: Es gibt Frameworks, die nur das Allergrundlegende können, aber sie sind sehr klein und einfach. Und es gibt große komplexe Frameworks, die viel mehr können.“

„Jackson ist eines der beliebtesten Frameworks. Wir werden es als Beispiel verwenden, wenn wir uns mit der Arbeit mit JSON befassen.“

„Zuerst müssen Sie dieses Framework herunterladen und zu Ihrem Projekt hinzufügen. Sie müssen dies direkt in IntelliJ IDEA tun. Sie können das Framework über diesen Link herunterladen .“

"Erledigt."

„Großartig. Dann lass uns weitermachen.“

„Das Konvertieren eines Java-Objekts in JSON ist ungefähr so ​​einfach wie das Serialisieren. Dafür gibt es eine spezielle ObjectMapper-Klasse (com.fasterxml.jackson.databind.ObjectMapper).“

„Lassen Sie mich Ihnen ein funktionierendes Beispiel zeigen, und dann analysieren wir es:“

Konvertieren Sie ein Objekt in 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);
}
Eine Cat-Klasse, deren Objekte in JSON konvertiert werden
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Serialisierungsergebnis und Bildschirmausgabe:
{"name":"Missy", "age":5, "weight":4}

"So funktioniert das:"

„In den Zeilen 4–7 erstellen wir ein Cat- Objekt und füllen es mit Daten.“

„In Zeile 10 erstellen wir ein Writer-Objekt, in das wir eine JSON-String-Darstellung des Objekts schreiben.“

„In Zeile 13 erstellen wir ein ObjectMapper- Objekt, das die gesamte Serialisierung durchführt.“

„In Zeile 16 schreiben wir die JSON-Darstellung des cat -Objekts an den Writer .“

„In den Zeilen 19-20 zeigen wir das Ergebnis auf dem Bildschirm an.“

„Alles sieht ziemlich einfach aus. Nicht schwieriger als die native Serialisierung in Java.“

„Wie würde eine Deserialisierung aussehen?“

„Es ist fast das Gleiche, nur kürzer:“

Konvertieren Sie ein Objekt aus 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);
}
Eine Klasse, deren Objekte aus dem JSON-Format deserialisiert werden
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

„Es ist noch einfacher. Wir nehmen ObjectMapper und übergeben ihm einen String oder einen StringReader mit JSON, sowie die Klasse des zu deserialisierenden Objekts . Dann rufen wir die Methode readValue auf und als Ausgabe erhalten wir ein fertiges Java-Objekt mit.“ alle Daten."

„Nun, das ist genau wie die Deserialisierung in Java.“

„Fast. Es gibt mehrere Anforderungen an Objekte, die in JSON serialisiert oder von JSON deserialisiert werden:“

1)  Die Felder müssen sichtbar sein: Sie müssen entweder öffentlich sein oder Getter und Setter haben.“

2)  Es muss einen Standardkonstruktor geben (einen ohne Parameter)“

„Ich verstehe. Das ist nicht allzu überraschend. Aber Java hat alles serialisiert, sogar private Felder.“

„Nun, das war Java. Es hat Zugriff auf versteckte Daten. Man kann sich nicht vor sich selbst verstecken.“

„Hier gibt es noch einen dritten Aspekt. Ich hoffe, Ihnen ist die Annotation @JsonAutoDetect in der Cat-Klasse aufgefallen?“

„Ja. Ich wollte gerade fragen, was es ist.“

„Es handelt sich um eine Annotation: Verwaltungsinformationen für das Jackson-Framework. Durch die Verwendung der richtigen Annotationen haben Sie eine ziemlich flexible Kontrolle über die Ergebnisse der Serialisierung in JSON.“

„Cool! Was für Anmerkungen gibt es?“

„Hier ein paar Beispiele:“

Anmerkung Beschreibung
@JsonAutoDetect Wird vor einer Klasse platziert.
Markiert eine Klasse als bereit für die Serialisierung in JSON.
@JsonIgnore Wird vor einer Eigenschaft platziert.
Die Eigenschaft wird während der Serialisierung ignoriert.
@JsonProperty Wird vor einer Eigenschaft oder einem Getter oder Setter platziert. Ermöglicht die Angabe eines anderen Feldnamens während der Serialisierung.
@JsonWriteNullProperties Wird vor einer Klasse platziert.
Objektfelder, die null sind, werden nicht ignoriert.
@JsonPropertyOrder Wird vor einer Klasse platziert.
Ermöglicht Ihnen, die Feldreihenfolge während der Serialisierung anzugeben.

„Wie interessant! Gibt es noch mehr?“

„Es gibt viele. Aber wir werden sie jetzt nicht behandeln. Lassen Sie uns nun unser erstes Beispiel etwas überarbeiten:“

Konvertieren Sie ein Objekt in 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);
}
Eine Klasse, deren Objekte in JSON konvertiert werden
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Serialisierungsergebnis und Bildschirmausgabe:
{"age":5, "alias":"Missy"}

„Der Code bleibt derselbe, aber ich habe die Anmerkungen geändert: Ich habe einen anderen Namen für das Namensfeld angegeben: Alias. Außerdem habe ich das Gewichtungsfeld als Ignorieren markiert, was zu einer Änderung des JSON-Objekts geführt hat.“

„Es ist gut, dass man alles so anpassen kann. Ich denke, ich werde das auf jeden Fall nützlich finden.“

„Und die Deserialisierung wird verstehen, wie das funktioniert? Bei der Deserialisierung von JSON zu einem Java-Objekt wird der Wert des Alias-Felds in das Namensfeld des Cat-Objekts geschrieben?“

„Ja, die Deserialisierung funktioniert wie sie sollte. Das ist klug.“

„Darüber kann man sich dann nicht freuen.“

„Danke für diese interessante Lektion, Ellie.“