Google Gson

Wstęp

Tutorial ten jest poświęcony zagadnieniu serializacji oraz deserializcji obiektów w Javie przy pomocy biblioteki Google Gson.

JSON (ang. JavaScript Object Notation) jest lekkim, tekstowym formatem wymiany danych komputerowych, służącym głównie do komunikacji pomiędzy serwerem, a aplikacją internetową. Często jest stosowany jako alternatywa dla XML. Składa się z par atrybut-wartość. Pomimo nazwy nie jest związany jedynie z językiem JavaScript, a narzędzia służące do konwersji z i do są dostępne w wielu językach programowania.

W przypadku języka Java istnieje kilka możliwości przetwarzania tego formatu. JEE (ang. Java Enterprise Edition) udostępnia standardowe API, jednakże odpowiedzialność za konwersje spada na nas. Podobne możliwości oferuje biblioteka json-simple.

Jednak tym co zazwyczaj interesowałoby nas, programistów Javy, jest prosty sposób na serializacje i deserializacje obiektów. Tutaj na tle powyższych bibliotek wyróżnia się Google Gson. Jest to elastyczna biblioteka, pozwalająca na dostosowanie działania. Domyślnie obsługuje typy proste, generyczne, kolekcje oraz klasy zagnieżdżone.

Aby skorzystać z tej biblioteki w przypadku maven’a należy dodać do pilku konfiguracyjnego pom.xml:

1. Opis funkcji

Google Gson używa mechanizmu refleksji, tak więc nie potrzebuje dodatkowych informacji do działania. Klasy muszą mieć jedynie zdefiniowany bezargumentowy konstruktor.

Deserializacja:

Serializacja:

przykładowo wyprodukuje:

Jednym z wartych uwagi mechanizmów jest to, iż biblioteka pozwala na pisanie własnych klas serializujących i deserializujących:

Aby użyć:

Dodatkowo za pomocą adnotacji @SerializedName można ustawić jaka nazwa atrybutu zostanie przypisana danemu polu.

Istnieją także inne możliwości zmiany domyślnego zachowania takie jak: obsługa pól z wartością null, wykluczanie pól z serializacji, manipulacja drzewem wyrażenia. Zarówno te, jak i inne funkcje są dokładnie opisane w poniższych pozycjach.

Przewodnik użytkownika:

https://sites.google.com/site/gson/gson-user-guide

API:

http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/overview-summary.html

2. Obsługa hierarchii klas

Aby komunikować się w wygodny sposób pomiędzy aplikacją internetową, a serwerem należy zaproponować wspólną hierarchię wiadomości.

Niniejszy podrozdział opisuje możliwość użycia biblioteki Google Gson w aspekcie takiej komunikacji.

classdiagram

Jak widać z diagramu klas (UML) mamy do czynienia z przykładową sytuacją, w której dwie wiadomości dziedziczą z abstrakcyjnej klasy Message. Abstrahując od zawartości klas, chcielibyśmy móc obsłużyć taką sytuacje za pomocą biblioteki. Ku temu należy utworzyć odpowiedni adapter:

Dzięki temu po otrzymaniu wiadomości tekstowej (np. za pomocą WebSocketAPI) możemy bezpośrednio ją przekonwertować na obiekt bazowej klasy Message i wykonać odpowiednią akcję w zależności od typu:

3. Ignorowanie pól

Biblioteka umożliwia ignorowanie klas z pewnymi słowami kluczowymi języka Javy:

Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.STATIC, Modifier.TRANSIENT, Modifier.VOLATILE).create();

Dostarcza także adnotacje @Expose(serialize = false, deserialize = false), informującą czy dane pole ma być serializowane/deserializowane. Aby jednak adnotacja miała wpływ, musimy użyć opcje:

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()

Powoduje ona także, iż wszystkie pola nie zawierające adnotacji @Expose też są ignorowane, co często nie jest tym czego byśmy oczekiwali.

Jednakże możemy sobie poradzić z tym problemem tworząc własną adnotacje:

oraz definiując własną strategie wykluczania:

Użycie:

spowoduje, iż tylko pola zawierające adnotacje @JsonIgnore zostaną pominięte.

Mechanizm ten może być oczywiście także wykorzystany do wiele bardziej złożonego filtrowania pól.