"Cześć, Amigo!"

"Cześć, Ellie!"

„Skoro zapoznałeś się już z formatem JSON, porozmawiajmy o tym dzisiaj”.

„OK. Gdzie jest zwykle używany?”

Oto jak to zwykle działa. Ktoś (klient) żąda danych z programu Java (serwera). Program tworzy obiekty Java i wypełnia je informacjami z bazy danych. Następnie konwertuje je do formatu, który żądający (klient ) może zrozumieć, na przykład JSON, i odsyła je z powrotem”.

„Pozwól, że powiem ci, jak pracować z JSON w Javie. Zasadniczo musimy zrobić tylko dwie rzeczy: serializować obiekty Java do formatu JSON i deserializować obiekty Java z formatu JSON”.

„Innymi słowy, JSON jest standardem przesyłania wiadomości/danych z jednego programu do drugiego. Istnieje wiele takich standardów. Ale jeśli program jest napisany w JavaScript, zwykle próbuje użyć JSON”.

"Ok, jestem gotowy."

„Świetnie. W takim razie zaczynajmy”.

Serializacja do JSON - 1

„Jak już wiesz, Java ma wbudowane standardowe narzędzia do serializacji. Ale nie obsługują one JSON. Więc jeśli potrzebujesz serializować obiekt do formatu JSON, możesz użyć jednego z popularnych frameworków (bibliotek), które wiedzą, jak Zrób to."

„Jaka jest różnica między tymi różnymi ramami?”

„Zwykle różnią się poziomem złożoności: istnieją frameworki, które mogą wykonywać tylko podstawowe czynności, ale są bardzo małe i proste. Są też duże, złożone frameworki, które mogą zrobić znacznie więcej”.

„Jackson to jeden z najpopularniejszych frameworków. Wykorzystamy go jako przykład, gdy przyjrzymy się, jak pracować z JSON”.

"Najpierw musisz pobrać ten framework i dodać go do swojego projektu. Musisz to zrobić bezpośrednio w IntelliJ IDEA. Możesz pobrać framework za pomocą tego linku ."

"Zrobione."

"Świetnie. Kontynuujmy więc."

„Konwersja obiektu Java na format JSON jest prawie tak prosta, jak serializacja. W tym celu dostępna jest specjalna klasa ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper).”

„Pozwól, że pokażę ci działający przykład, a następnie go przeanalizujemy”:

Konwertuj obiekt na 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);
}
Klasa Cat, której obiekty są konwertowane na format JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;
Cat(){}
}
Wynik serializacji i wyjście ekranu:
{"name":"Missy", "age":5, "weight":4}

"Oto jak to działa:"

„W liniach 4-7 tworzymy obiekt Cat i wypełniamy go danymi”.

„W wierszu 10 tworzymy obiekt Writer, w którym napiszemy reprezentację obiektu w postaci ciągu JSON”.

„W linii 13 tworzymy obiekt ObjectMapper , który wykona całą serializację”.

„W wierszu 16 zapisujemy reprezentację JSON obiektu cat do writer ”.

„W wierszach 19-20 wyświetlamy wynik na ekranie”.

„Wszystko wygląda całkiem prosto. Nie trudniejsze niż natywna serializacja w Javie”.

„Jak wyglądałaby deserializacja?”

„To prawie to samo, tylko krótsze:”

Konwertuj obiekt z 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);
}
Klasa, której obiekty są deserializowane z formatu JSON
@JsonAutoDetect
class Cat
{
 public String name;
 public int age;
 public int weight;

 Cat() { }
}

„To jeszcze prostsze. Bierzemy ObjectMapper i przekazujemy mu ciąg znaków lub StringReader z JSON, a także klasę obiektu do deserializacji . Następnie wywołujemy metodę readValue , a jako wyjście otrzymujemy gotowy obiekt Java z wszystkie dane”.

„Cóż, to dokładnie tak, jak deserializacja w Javie”.

„Prawie. Istnieje kilka wymagań dotyczących obiektów serializowanych do lub deserializowanych z formatu JSON:”

1)  pola muszą być widoczne: muszą być publiczne lub mieć pobierające i ustawiające”

" 2)  musi istnieć domyślny konstruktor (bez parametrów)"

„Rozumiem. Nie jest to zbyt zaskakujące. Ale Java serializowała wszystko, nawet pola prywatne”.

„Cóż, to była Java. Ma dostęp do ukrytych danych. Nie możesz się ukryć przed samym sobą”.

„Jest tu trzeci aspekt. Mam nadzieję, że zauważyłeś adnotację @JsonAutoDetect w klasie Cat?”

- Tak. Właśnie miałem zapytać, co to było.

„To adnotacja: informacje porządkowe dla frameworka Jacksona. Używając odpowiednich adnotacji, masz dość elastyczną kontrolę nad wynikami serializacji do formatu JSON”.

„Fajnie! Co to za adnotacje?”

„Oto kilka przykładów:”

Adnotacja Opis
@JsonAutoDetect Umieszczony przed klasą.
Oznacza klasę jako gotową do serializacji do formatu JSON.
@JsonIgnoruj Umieszczony przed nieruchomością.
Właściwość zostanie zignorowana podczas serializacji.
@JsonProperty Umieszczony przed właściwością lub getterem lub setterem. Umożliwia określenie innej nazwy pola podczas serializacji.
@JsonWriteNullProperties Umieszczony przed klasą.
Pola obiektów, które są puste, nie będą ignorowane.
@JsonPropertyOrder Umieszczony przed klasą.
Umożliwia określenie kolejności pól podczas serializacji.

„Jakie to interesujące! Czy jest ich więcej?”

„Jest ich wiele. Ale nie będziemy ich teraz omawiać. Teraz przeróbmy nieco nasz pierwszy przykład:”

Konwertuj obiekt na 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);
}
Klasa, której obiekty są konwertowane na format JSON
@JsonAutoDetect
class Cat
{
 @JsonProperty("alias")
 public String name;
 public int age;
 @JsonIgnore
 public int weight;

 Cat() {
 }
}
Wynik serializacji i wyjście ekranu:
{"age":5, "alias":"Missy"}

„Kod pozostaje ten sam, ale zmieniłem adnotacje: podałem inną nazwę dla pola nazwy: alias. Zaznaczyłem również pole wagi jako Ignoruj, co spowodowało zmianę obiektu JSON”.

„Dobrze, że można wszystko tak dostosować. Myślę, że na pewno mi się to przyda”.

„A deserializacja zrozumie, jak z tym pracować? Podczas deserializacji z JSON do obiektu Java, wartość pola aliasu zostanie wpisana do pola nazwy obiektu Cat?”

„Tak, deserializacja będzie działać tak, jak powinna. Jest inteligentna”.

- Z czego się nie cieszyć w takim razie.

„Dziękuję za tę interesującą lekcję, Ellie”.