JsonConverter для объединений, созданных замороженным пакетом в dart
Я пытаюсь реализовать toJson/fromJson для объединения, созданного замороженным пакетом. Допустим, у нас есть следующий класс:
@freezed
abstract class Result with _$Result {
const factory Result.error(String message) = Error;
const factory Result.success() = Success;
factory Result.fromJson(Map<String, dynamic> json) => _$ResultFromJson(json);
}
Где я хочу, чтобы / fromJson вел себя следующим образом:
Result error = Result.error('some error');
expect(error.toJson(), {'type': 'error', 'message': 'some error'});
expect(Result.fromJson({'type': 'error', 'message': 'some error'}), error);
В документации указано, что вы можете использовать JsonConverter
(из JSON с несколькими классами), но я не знаю, как его правильно использовать.
class ResultConverter implements JsonConverter<Result, Map<String, dynamic>> {
const ResultConverter();
@override
Result fromJson(Map<String, dynamic> json) {
if (json == null) {
return null;
}
switch (json['type'] as String) {
case 'success':
return Success.fromJson(json);
case 'error':
return Error.fromJson(json);
default:
throw FallThroughError();
}
}
@override
Map<String, dynamic> toJson(Result object) => object.map(
error: (e) => {'type': 'error', ...e.toJson()},
success: (s) => {'type': 'success', ...s.toJson()},
);
}
fromJson
отлично работает, если заводской метод вызывает ResultConverter().fromJson(this)
вместо сгенерированного, но это похоже на обходной путь и не будет работать с toJson.
Можно ли каким-то образом аннотировать класс Result, чтобы генерация кода использовала конвертер?
3 ответа
Да, этот ресурс мне помог - ссылка для достижения.
Кроме того, он работает для выделенного именованного конструктора в случае
freezed
упаковка.
Вот так (обратите внимание, нет
abstract
ключевое слово и
private
добавлен конструктор):
@freezed
class Result with _$Result {
const Result._();
@ResultConverter()
const factory Result.error(String message) = Error;
@ResultConverter()
const factory Result.success() = Success;
factory Result.fromJson(Map<String, dynamic> json) => _$ResultFromJson(json);
}
сдача
toJson(Result object)
способ быть таким
@override
Map<String, dynamic> toJson(Result object) => object.toJson();
Вы можете просто использовать свой конвертер.
Попробуй это:
final result = ResultConverter().fromJson(json);