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);
}

我想/从Json的行为如下:

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()},
);
}

如果工厂方法调用ResultConverter().fromJson(this)而不是生成的方法,fromJson工作正常,但这感觉像是一种解决方法,不适用于 toJson。

是否可以以某种方式注释 Result 类,以便代码生成将使用转换器?

是的,这个资源帮助了我 - 链接来实现它。

此外,在包的情况下,它适用于专用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);

相关内容

  • 没有找到相关文章

最新更新