使用@JsonSerializable() 时如何在Dart/Flutter 中获得动态多类型值?
How to have dynamic multitype value in Dart/Flutter when using @JsonSerializable()?
我将 Flutter 与 json_annotation
库一起使用,并且有一个数据 class 用于表示来自一个 api.
的 json 响应
import 'package:json_annotation/json_annotation.dart';
import 'package:app/dtos/user.dart';
import 'package:app/dtos/limited_user.dart';
part 'pending_project.g.dart';
@JsonSerializable()
class PendingProject {
@JsonKey(name: "user")
final User|LimitedUser user; // here I might have sometimes returned User type other types LimitedUser
@JsonKey(name: "updatedAt")
final String updatedAt;
PendingProject(this.user, this.updatedAt);
factory PendingProject.fromJson(Map<String, dynamic> json) =>
_$PendingProjectFromJson(json);
Map<String, dynamic> toJson() => _$PendingProjectToJson(this);
}
api returns user
字段的不同值基于某些逻辑。
有时对象类型 User
其他类型类型 LimitedUser
我定义了这两个对象,但无法使其在上面的 json 架构中工作。
如何将用户对象保留为动态可能或 json 字符串并在代码或其他一些解决方案中进一步手动解析
User
和 LimitedUser
都有一个名为 type
的公共字段,它允许我们区分返回的内容。
对于用户,键入="用户"
对于有限用户,键入="limitedUser"
所有其他字段可能不同,我们不能假设任何其他内容
PS:
pending_project.g.dart 是由 运行 flutter packages pub run build_runner build
与库本身自动生成的文件
我使用 fromJson
解决了这个问题
@JsonKey(name: "user", fromJson: mapUser)
final Object user;
/// other code
Object mapUser(Map<String, dynamic> value) {
if (value['type'] == 'user') {
User.fromJson(value);
}
return LimitedUser.fromJson(value);
}
ui 中的其他代码正在检查:
if (obj is User) {
return somewidgetforuser(obj);
}
return somewidgedforlimiteduser(obj);
我将 Flutter 与 json_annotation
库一起使用,并且有一个数据 class 用于表示来自一个 api.
import 'package:json_annotation/json_annotation.dart';
import 'package:app/dtos/user.dart';
import 'package:app/dtos/limited_user.dart';
part 'pending_project.g.dart';
@JsonSerializable()
class PendingProject {
@JsonKey(name: "user")
final User|LimitedUser user; // here I might have sometimes returned User type other types LimitedUser
@JsonKey(name: "updatedAt")
final String updatedAt;
PendingProject(this.user, this.updatedAt);
factory PendingProject.fromJson(Map<String, dynamic> json) =>
_$PendingProjectFromJson(json);
Map<String, dynamic> toJson() => _$PendingProjectToJson(this);
}
api returns user
字段的不同值基于某些逻辑。
有时对象类型 User
其他类型类型 LimitedUser
我定义了这两个对象,但无法使其在上面的 json 架构中工作。
如何将用户对象保留为动态可能或 json 字符串并在代码或其他一些解决方案中进一步手动解析
User
和 LimitedUser
都有一个名为 type
的公共字段,它允许我们区分返回的内容。
对于用户,键入="用户"
对于有限用户,键入="limitedUser"
所有其他字段可能不同,我们不能假设任何其他内容
PS:
pending_project.g.dart 是由 运行 flutter packages pub run build_runner build
我使用 fromJson
解决了这个问题
@JsonKey(name: "user", fromJson: mapUser)
final Object user;
/// other code
Object mapUser(Map<String, dynamic> value) {
if (value['type'] == 'user') {
User.fromJson(value);
}
return LimitedUser.fromJson(value);
}
ui 中的其他代码正在检查:
if (obj is User) {
return somewidgetforuser(obj);
}
return somewidgedforlimiteduser(obj);