【问题标题】:parsing JSON with a nested, dynamic type使用嵌套的动态类型解析 JSON
【发布时间】:2021-10-18 08:35:16
【问题描述】:

假设我有 3 个数据类(实际上可能更多)。 A B 类应使用数据类型标识符包装在 Wrap 类中。这将允许在应用程序内部对 json 接口提供的任何数据类型使用相同的过程。

class Wrap{
  int id;
  List<dynamic> dataSet;
  Wrap({required this.id, required this.dataSet});
}

class A{
  int a=0;
  A({this.a});
}

class B{
  bool b=true;
  B({this.b});
}

我的目标是使用映射 getDataType = {0: A, 1: B}; 然后解析嵌套的 Json

dataSets: List<dynamic>.from(json["dataSets"].map((d) => getDataType[json["id"].fromJson(d)).toList();

但不幸的是,当尝试从包含类型的变量访问类方法时,这已经失败了

class A{
  int i=0; A({i});
  factory A.test(int i) => A(2*i); 
}

main() {
  final t = A;
  final x = t.test(2);
}

任何有聪明想法的人如何实现这一目标?

这种非正统数据结构背后的原因是:我在业务逻辑层有一个数据管理器,它根据某些事件触发不同的 UI,来自不同的逻辑。然后,管理器获取 UI 的特定数据。为了简化这一点,应使用具有相同功能的相同存储库。但是,存储库函数根据 UI 使用不同的数据库表。

更新:最基本的 json 示例:

{
 "id": 0,
  "data": [ 
    {
      "problemId": 0,
      "level": 2
    }
  ]
}

【问题讨论】:

  • 你能添加你要解析的模板json吗
  • 作为问题的更新完成。谢谢
  • 查看类似问题的答案:stackoverflow.com/a/57661860/6704033
  • 那个不同,它有一个不变的数据结构——除非我错过了什么

标签: json flutter dart dynamic


【解决方案1】:

首先为数据集创建一个抽象类

abstract class Dataset {
  const Dataset();
  factory Dataset.fromMap(Map<String, dynamic> map, int type) {
    switch (type) {
      case 0:
        return ADataset.fromMap(map);
      case 1:
        return BDataset.fromMap(map);
      default:
        throw Exception("Class with id $type couldn't be found");
    }
  }
}

并将Wrap 类中的List&lt;dynamic&gt; dataSet; 替换为List&lt;Dataset&gt; dataSet;

现在您可以通过扩展这个 Dataset 类来简单地创建数据集类

class ADataset extends Dataset {
  final int fieldA;
  ADataset(
    this.fieldA,
  );
  factory ADataset.fromMap(Map<String, dynamic> map) {
    return ADataset(map['int field']);
  }
}

class BDataset extends Dataset {
  final String fieldB;
  BDataset(
    this.fieldB,
  );
  factory BDataset.fromMap(Map<String, dynamic> map) {
    return BDataset(map['string field']);
  }
}

所以现在你需要做的就是

dataSets: List<Dataset>.from(map['datasets'].map(
    (dataset) => Dataset.fromMap(dataset, map['type']),
  ));

【讨论】:

  • 这看起来很有希望。非常感谢。不过,我有一个问题。我的数据类已经是抽象的,因为我正在使用 freezed 包进行类比较等。因此,我的类定义看起来像这样,因为 freezed :@freezed abstract class ProblemsDto implements _$ProblemsDto { 我可以用mixin 以某种方式使用你的方法吗?我知道,mixin 存在,但还没用过。
  • @w461 不是真的,mixin 不能用于实现构造函数。
  • 你可以创建子类@freezed而不是接口
  • 我正在重构它而不冻结,无论如何,对于那些类来说没有多大价值。再次感谢!
  • Map&lt;String, dynamic&gt; toJson(); 添加到抽象数据集类并在子类中覆盖它。那么您可以按照您提到的方式转换数据集,我认为这是一种优雅的方式。 @w461
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多