Как стать автором
Обновить

Почему в Flutter невозможен аналог GSON/Jackson/Moshi

Введение

Дадим ответ почему в Flutter не будет в ближайшее время аналога GSON/Jackson или что вам по вкусу. (Далее просто GSON)

Эх, надеюсь однажды на Flutter появятся аналоги того же GSON/Jackson…

Если кратко: рантайм рефлексию во Flutter не завезли.


Далее для тех кто хочет подробностей.

Пути реализации JSON сериализация

Мы имеем POJO объект написанный на любом языке программирования (Kotlin/Swift/C# etc) и нам нужно передать данные этого объекта на сервер в JSON формате. Здесь есть 3 пути:

Захардкодить

Самый простой способ на первый взгляд. Никаких лишних технологий, бери и пиши напрямую!

Но здесь мы встречаемся с проблемой: При каждом изменение нашего POJO требуется вручную переписывать каждое поле, при этом есть шанс допустить глупую ошибку, на дебаг которой может уйти много времени. В общем лишняя головная боль, когда нам нужно быстро сделать MVP, и ресурсы разумнее тратить на более важные вещи.

PainKiller

Так почему же мы не можем автоматизировать этот нудный процесс? Конечно можем! Для этого и существуют библиотеки по типу GSON и прочих. Такая библиотека избавит нас от бойлерплейта, поскольку берёт на себя задачу перегонки полей в JSON строку.

Так что же не так с Flutter?

Её величество "Рефлексия"

Для работы подобной технологии требуется прочесть объект и узнать его поля "изнутри". Этот механизм рефлексии, который позволяет залезть под капот класса к любым полям.

К примеру возьмём класс Student, который имеет 2 поля: name и age.

class Student { 
   private String name; 
   private int age; 
   public Student(){} 
   
   public String getName() { 
      return name; 
   } 
   
   public void setName(String name) { 
      this.name = name; 
   } 
   
   public int getAge() { 
      return age; 
   } 
   
   public void setAge(int age) { 
      this.age = age; 
   }
}

GSON во время работы приложения читает поля этого класса и даёт строку

Gson gson = new GsonBuilder.create(); 

Student student = new Student();
student.setName("Nick");
student.setAge(20);

gson.toJson(student); //{name:"Nick", age:20}

А заранее скомпилировать?

Конечно, можно скомпилировать бойлерплейт заранее. Также нужно к каждому классу вручную писать аннотации по типу @JsonSerializable(), для того чтобы код был заботливо скомпилирован, иначе ничего работать не будет.

Рефлексию увы не поддерживаем
Рефлексию увы не поддерживаем

Почему разработчики Flutter решили убрать runtime reflection я ответа на данный момент не нашёл.

Если есть ответ на данный вопрос, то можно поделиться в комментариях.

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.