169 похожих чатов

Всем привет! Не подскажете, как более правильно подружить json serializable и

генерик объекты?

Набросал небольшой пример, но мне очень не нравится обилие букв и корявость происходящего

Ну или если это фигня на ваш взгляд, как бы вы разбирали какой-нибудь Paged Response?
___

void main() {
final process1 = '{"id":"123", "type":"Variant1", "data":{"something":"kek1"}}';
final process2 = '{"id":"123", "type":"Variant2", "data":{"another":"kek2"}}';

final decoded1 = jsonDecode(process1) as Map<String, dynamic>;
final decoded2 = jsonDecode(process2) as Map<String, dynamic>;

print("parsed");

final result1 = DataVariant1Proces.fromJson(decoded1, ProcesType.Variant1);
final result2 = DataVariant2Proces.fromJson(decoded2, ProcesType.Variant2);

print("created");

print("serialized back\n$result1\n$result2");
}
___

import 'package:json_annotation/json_annotation.dart';

part 'generic_process_demo.g.dart';

enum ProcesType { Variant1, Variant2 }

typedef DataVariant1Proces = Proces<DataVariant1>;
typedef DataVariant2Proces = Proces<DataVariant2>;

@JsonSerializable()
class DataVariant1 {
DataVariant1({required this.something});
factory DataVariant1.fromJson(Map<String, dynamic> json) => _$DataVariant1FromJson(json);

Map<String, dynamic> toJson() => _$DataVariant1ToJson(this);

final String something;

@override
String toString() => toJson().toString();
}

@JsonSerializable()
class DataVariant2 {
DataVariant2({required this.another});
factory DataVariant2.fromJson(Map<String, dynamic> json) => _$DataVariant2FromJson(json);

Map<String, dynamic> toJson() => _$DataVariant2ToJson(this);

final String another;

@override
String toString() => toJson().toString();
}

@JsonSerializable(genericArgumentFactories: true)
class Proces<T> {
Proces({required this.id, required this.data, required this.type});

factory Proces.fromJson(Map<String, dynamic> json, ProcesType type) {
switch (type) {
case ProcesType.Variant1:
return _$ProcesFromJson(json, (Object? o) => _$DataVariant1FromJson(o as Map<String, dynamic>) as T);
case ProcesType.Variant2:
return _$ProcesFromJson(json, (Object? o) => _$DataVariant2FromJson(o as Map<String, dynamic>) as T);
}
}

Map<String, dynamic> toJson() {
switch (type) {
case ProcesType.Variant1:
return _$ProcesToJson<DataVariant1>(this as Proces<DataVariant1>, _$DataVariant1ToJson);
case ProcesType.Variant2:
return _$ProcesToJson<DataVariant2>(this as Proces<DataVariant2>, _$DataVariant2ToJson);
}
}

final String id;
final ProcesType type;
final T data;

@override
String toString() => toJson().toString();
}

5 ответов

11 просмотров

Первое и главное Не постить такую колбасу в чат!

Максим- Автор вопроса

Посмотрите в сторону freezed: https://pub.dev/packages/freezed#fromjson---classes-with-multiple-constructors

Максим- Автор вопроса

Спасибо, выглядит очень прикольно Остался один нюанс - можно ли от чего-то унаследовать кейсы в юнионе? Например у меня все они одинаковые, но отличаются одним только полем data И писать целиком конструктор для каждого из них не очень удобно

Максим
Спасибо, выглядит очень прикольно Остался один нюа...

Если type используется только для определения варианта при десериализации, то его в конструкторе можно и не задавать. А остальные поля придется писать, скорее всего.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта