Skip to main content
CheckTown
Konwertery

Jak konwertować JSON na klasy modeli Dart

Opublikowano 5 min czytania
W tym artykule

Dlaczego programiści Dart/Flutter potrzebują generowania klas JSON

Aplikacje Flutter w dużym stopniu polegają na JSON do komunikacji API, ale Dart nie ma wbudowanego mapowania JSON-na-obiekt jak Gson czy Jackson w innych językach. Każda odpowiedź API wymaga klasy modelu z ręcznymi metodami fabrycznymi fromJson i toJson. Dla aplikacji korzystających z wielu endpointów ten szablonowy kod szybko się mnoży — nasz konwerter generuje kompletne klasy modeli Dart z próbek JSON natychmiastowo, oszczędzając godziny powtarzalnego kodowania.

Od kiedy Dart 2.12 wprowadził sound null safety, każde pole w Twoich klasach modeli musi być jawnie typowane jako nullable lub non-nullable. Konwerter analizuje Twoje dane JSON, aby określić prawidłową nullability dla każdego pola, tworząc modele, które poprawnie działają z systemem null safety Darta od samego początku.

Wzorzec fromJson/toJson

Konwerter generuje klasy Dart zgodnie ze standardowym wzorcem konstruktora fabrycznego używanym w ekosystemie Flutter.

  • factory fromJson — generuje konstruktor fabryczny, który przyjmuje Map<String, dynamic> i inicjalizuje wszystkie pola z odpowiednim rzutowaniem typów, sprawdzeniami null i parsowaniem zagnieżdżonych obiektów
  • Metoda toJson — tworzy metodę toJson() zwracającą Map<String, dynamic> do serializacji, obsługując zagnieżdżone obiekty przez rekurencyjne wywoływanie ich metod toJson()
  • Generowanie zagnieżdżonych modeli — gdy JSON zawiera zagnieżdżone obiekty, konwerter tworzy oddzielne klasy Dart dla każdej zagnieżdżonej struktury z własnymi metodami fromJson/toJson, prawidłowo powiązanymi z klasy rodzica

Wypróbuj za darmo — bez rejestracji

Konwertuj JSON na Dart →

Null safety i integracja json_serializable

Konwerter generuje null-safe kod Dart kompatybilny z nowoczesnymi praktykami rozwoju Flutter.

  • Sound null safety — pola z wartościami null w próbce JSON są typowane jako nullable (String?), podczas gdy obecne wartości używają typów non-nullable (String), z odpowiednimi sprawdzeniami null w konstruktorach fromJson
  • Kompatybilność z json_serializable — wygenerowana struktura klasy jest kompatybilna z pakietem json_serializable, pozwalając dodać adnotacje @JsonSerializable() i @JsonKey do generowania kodu za pomocą build_runner
  • Obsługa list — tablice obiektów generują typy List<ChildModel> z odpowiednim mapowaniem w fromJson używając .map() i .toList(), obsługując zarówno nullable, jak i non-nullable scenariusze list

Często zadawane pytania

Czy powinienem użyć pakietu freezed zamiast tego?

Pakiet freezed dodaje niezmienność, typy union i wsparcie pattern matching do klas Dart, ale wymaga konfiguracji build_runner i dodaje złożoność kompilacji. Nasz konwerter generuje zwykłe klasy Dart, które działają bez zależności generowania kodu. Możesz migrować wyjście do freezed później, dodając adnotacje — nazwy pól i typy pozostają takie same.

Jak konwerter obsługuje zagnieżdżone modele JSON?

Każdy zagnieżdżony obiekt JSON staje się oddzielną klasą Dart z własnym factory fromJson i metodą toJson. Klasa rodzic odwołuje się do klasy dziecka w swojej deklaracji typu i wywołuje ChildModel.fromJson() w swoim konstruktorze fabrycznym. Głęboko zagnieżdżone struktury są w pełni obsługiwane z odpowiednimi hierarchiami typów.

Jak obsługiwane są pola List w wygenerowanym kodzie?

Listy prymitywów generują proste typowane listy (List<String>, List<int>). Listy obiektów generują List<ChildModel> z mapowaniem fromJson: (json['items'] as List).map((e) => ChildModel.fromJson(e)).toList(). Nullable listy zawierają sprawdzenia null, a puste tablice generują prawidłowo typowane wartości domyślne pustych list.

Powiązane narzędzia