Dart:基于 JSON 响应创建动态类

Yud*_*ngh 5 class dart flutter

我需要创建一个具有动态字段的类,这取决于 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'],
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

如果响应是:

{
  "field1": 123,
  "field2": 432,
  "field3": 213,
  "field4": 331
}
Run Code Online (Sandbox Code Playgroud)

但这并不适用于所有情况,因为某些响应包含少于或多于 4 个字段。

有可能:

{
  "field1": 123,
  "field2": 432,
  "field3": 213
}
Run Code Online (Sandbox Code Playgroud)

或者

{
  "field1": 123,
  "field2": 432,
  "field3": 213,
  "field4": 331,
  "field5": 251
}
Run Code Online (Sandbox Code Playgroud)

如何创建一个动态类来检查有多少字段并在运行时创建自己?

Cop*_*oad 7

AFAIK,截至今天,没有办法实现您在 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
}
Run Code Online (Sandbox Code Playgroud)