使用@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 字符串并在代码或其他一些解决方案中进一步手动解析

UserLimitedUser 都有一个名为 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);