PHP – Serializacja obiektów za pomocą JsonSerializable

Przykładowa implementacja interfejsu JsonSerializable umożliwiającego serializację obiektów do formatu JSON.

517
views

Miałem ostatnio potrzebę serializacji obiektów do formatu JSON. Nie potrzebowałem rozbudowanych bibliotek, a tym bardziej wprowadzania kolejnych zależności do projektu. Mam nieodparte wrażenie, że w każdym z projektów w których pracuje, jesteśmy krok od Dependency Hell.

Na szczęście do prostych zadań, świetnie spisuje się dostarczony w PHP (od wersji 5.4 wraz z modułem JSON) interfejs JsonSerializable. Wystarczy aby klasa implementująca interfejs posiadała metodę jsonSerialize() która zwraca dane mogące zostać zserializowane funkcją json_encode(). Czyli tak na prawdę każdy dowolny typ danych, za wyjątkiem typu resource.

Zdefiniuję na początek trzy różne klasy – Author, Comment, Article. Każda z nich posiada implementację interfejsu JsonSerializable. Dla uproszczenia przykładu w klasie Article, na sztywno ustawiam wymagane wartości.

Obiekt klasy Author przy serializacji do formatu JSON zwróci najprostszą informację – dana typu string. Natomiast instancja klasy Comment – tablicę asocjacyjną. Najbardziej złożona w tym przypadku jest klasa Article. Jej instancja po serializacji do formatu JSON wymaga również transformacji obiektów zależnych – Author oraz tablicy obiektów Comment.

Sprowadzenie obiektów do formatu JSON wymaga jedynie wywołania funkcji json_encode():

Rezultatem wywołania funkcji będzie następujący format danych:

Można również zmienić domyślny sposób serializacji danych dla klasy DateTime. Wystarczy stwórzyć własną (np. MyDateTime), rozszerzając klasę DateTime, a następnie implementując interfejs JsonSerializable. Potrzeba przykładu? Proszę:

Jeżeli Twój system nie składa się z kilkudziesięciu klas które należy zserializować do formatu JSON, rozwiązanie zaprezentowane powyżej jest całkiem przyjemne. Implementacja jednej metody, możliwość definiowania formatu końcowego (struktury oraz nazewnictwa poszczególnych pól) jest szybka, a dodatkowo nie wymaga kolejnej zależności do biblioteki zewnętrznej. Jeśli natomiast nasz system bardzo szybko się rozrasta, posiadamy z dnia na dzień kolejne klasy wymagające transformacji – to prawdopodobnie jest to dobry moment na zastanowienie się nad automatyzacją serializacji.

Poprzedni artykułRelacja z konferencji 4developers
Następny artykułAuditor – Gulp – czyli sposób na automatyzację powtarzających się zadań
Na co dzień Software Engineer. Fascynat programowania, architektury, metodyk zwinnych i dobrych praktyk w szerokim ujęciu. Polyglot Programer kochający poznawać nowe języki jednocześnie wykorzystując ich najlepsze strony. Założyciel DevEnv i współautor podcastu Dev:Cast. After Hours czyli gdy nie pracuje i nie robi czegoś na DevEnv - podróżnik w miejsca zapomniane, pasjonat lokalnej historii. Mocno zajarany survivalem, urbexem i militariami. Jest jednym z opiekunów schronu bojowego WAWOK w Rybniku.
PODZIEL SIĘ