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);
Другие вопросы по тегам