首页 > 解决方案 > Flutter - 如何将嵌套的 json 解析为具有泛型的类?

问题描述

我想知道如何将嵌套的 json 解析为具有泛型类型的类。我的目的是用代码和消息包装来自后端的响应(例如包含令牌的 loginRespose)

我有

class BaseResponse<T>{
  int code;
  String message;
  T responseObject;

  BaseResponse.fromJson(Map<String, dynamic> parsedJson)
    : code = parsedJson['Code'],
      message = parsedJson['Message'],
      responseObject = T.fromJson(parsedJson['ResponseObject']); //This is what I'd like to do
}

显然最后一行会引发错误,因为 T 没有命名构造函数“fromJson”。我尝试向 Type 添加一些限制,但没有找到任何解决方案。你知道如何解决这个问题吗?

标签: jsonparsinggenericsdartflutter

解决方案


你不能做这样的事情,至少不能颤抖。Asdart:mirror已禁用,并且没有类构造函数的接口。

你将不得不采取不同的路线。

我会建议改用 POO。你会在这里放弃反序列化responseObject你的BaseResponse. 然后让子类BaseResponse处理这个反序列化

通常,每种类型都有一个子类:

class IntResponse extends BaseResponse<int> {
  IntResponse.fromJson(Map<String, dynamic> json) : super._fromJson(json) {
    this.responseObject = int.parse(json["Hello"]);
  }
}

然后,您可以通过添加自定义工厂构造函数来隐藏这些混乱,BaseResponse使其更方便使用。

class BaseResponse<T> {
  int code;
  String message;
  T responseObject;

  BaseResponse._fromJson(Map<String, dynamic> parsedJson)
      : code = parsedJson['Code'],
        message = parsedJson['Message'];

  factory BaseResponse.fromJson(Map<String, dynamic> json) {
    if (T == int) {
      return IntResponse.fromJson(json) as BaseResponse<T>;
    }
    throw UnimplementedError();
  }
}

然后要么直接实例化想要的类型,要么使用工厂构造函数:

final BaseResponse foo = BaseResponse.fromJson<int>({"Hello": "42", "Code": 42, "Message": "World"});

推荐阅读