Dart:根据JSON响应创建动态类

9
我需要创建一个类,其中包含的字段是根据API返回结果动态变化的。
我正在使用自定义的Rest API,它返回的数据在每种情况下的字段数量并不相同。到目前为止,我一直使用具有工厂构造函数的类从响应中创建对象,如下所示:
class MyClass {
  dynamic field1;
  dynamic field2;
  dynamic field3;
  dynamic field4;

  MyClass({
    this.field1,
    this.field2,
    this.field3,
    this.field4,
  });

  factory MyClass.fromJson(dynamic json) {
    return MyClass(
      field1: json['field1'],
      field2: json['field2'],
      field3: json['field3'],
      field4: json['field4'],
    );
  }
}

如果响应如下,则上述类能够正常运行:

{
  "field1": 123,
  "field2": 432,
  "field3": 213,
  "field4": 331
}

但是这种方法并不适用于所有情况,因为一些响应包含少于或多于4个字段。
它可以是以下情况之一:
{
  "field1": 123,
  "field2": 432,
  "field3": 213
}

或者

{
  "field1": 123,
  "field2": 432,
  "field3": 213,
  "field4": 331,
  "field5": 251
}

我该如何创建一个动态类,它可以检查有多少个字段并在运行时创建自己?

1
如果字段数量是动态的,请将字段保存在ListMap中。 - julemand101
1
我知道那是一种方法,但我不想用它。我需要可以轻松访问属性的对象。我正在寻找类似于Java中反射的东西。 - Yudhishthir Singh
2
类的目的是拥有一个定义好的接口,可以在其他类或方法中使用。但是如果您的类是在运行时动态构建的,并且具有动态数量的方法,那么您将如何在编程中使用此类?您能否给出一个伪代码示例,说明您希望它如何工作? - julemand101
1个回答

11

据我所知,目前在Dart中没有实现您所要求的方法。您可以做的是:

class MyClass {
  final Map<dynamic, dynamic> data;

  MyClass(this.data);

  factory MyClass.fromJson(dynamic json) {
    assert(json is Map);
    return MyClass(json['data']);
  }
}

void main() {
  // Let's say this is your json
  final json = {
    'data': {
      'field1': 1,
      'field2': 2.2,
    },
  };

  // Create your MyClass instance
  var myClass = MyClass.fromJson(json);

  // Get the values
  var field1 = myClass.data['field1']; // prints 1
  var field2 = myClass.data['field2']; // prints 2.2
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接