自定义json转换器,带有不带包装类的冷冻



我使用冷冻包来处理不可变模型,并利用json_serializable包的内置功能进行json序列化。我有一个简单的User类/模型,具有不同的并集类型(UserLoggedInUserGeneralUserError(:

@freezed
class User with _$User {
const factory User(String id, String email, String displayName) =
UserLoggedIn;
const factory User.general(String email, String displayName) = UserGeneral;
const factory User.error(String message) = UserError;
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
}

由于我使用多个构造函数,并且不希望我的API包含文档中建议的runtimeType键,因此我可以编写一个转换器(向下滚动一点,句子开头为:如果您不控制JSON响应,则可以实现自定义转换器。(

因此,基于此,我编写了以下转换器类:

class UserConverter implements JsonConverter<User, Map<String, dynamic>> {
const UserConverter();
@override
User fromJson(Map<String, dynamic> json) {
if (json['id'] != null) {
return UserLoggedIn.fromJson(json);
} else if (json['error'] != null) {
return UserError.fromJson(json);
} else {
return UserGeneral.fromJson(json);
}
}
@override
Map<String, dynamic> toJson(User data) => data.toJson();
}

文档现在引用了另一个类(包装类(,该类现在将通过注释使用这个转换器,类似于以下内容:

@freezed
class UserModel with _$UserModel {
const factory UserModel(@UserConverter() User user) = UserModelData;
factory UserModel.fromJson(Map<String, dynamic> json) =>
_$UserModelFromJson(json);
}

问题:是否可以在不使用包装类(UserModel(的情况下使用此转换器

推理:这个包装类添加了另一层不需要的抽象(在我的情况下(。特别是因为包装器类没有任何其他好处/目的,而且感觉在不使用它的情况下应该可以做到这一点

这听起来可能很明显也很懒,但假设以下内容足够,为什么不在模型类中编写自定义fromJson呢?

// We write a custom fromjson but still want fromjson constructors
// to be generated
@Freezed(fromJson: true, toJson: true)
sealed class User with _$User {
const factory User(String id, String email, String displayName) =
UserLoggedIn;
const factory User.general(String email, String displayName) = UserGeneral;
const factory User.error(String message) = UserError;
factory User.fromJson(Map<String, dynamic> json) {
// We paste our JsonConverter.fromJson in a fromjson factory
if (json['id'] != null) {
return UserLoggedIn.fromJson(json);
} else if (json['error'] != null) {
return UserError.fromJson(json);
} else {
return UserGeneral.fromJson(json);
}
}
}

这样,您仍然可以获得一个toJson方法,该方法受您提到的其他@freezed规则的约束。

相关内容

  • 没有找到相关文章

最新更新