"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”.

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