json - Flutter - 如何将嵌套的 json 解析为具有泛型的类?

标签 json parsing generics dart flutter

我想知道如何将嵌套的 json 解析为具有泛型类型的类。我的意图是用代码和消息包装来自后端的响应(例如包含 token 的 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 添加一些限制,但没有找到任何解决方案。您对如何实现这一点有任何想法吗?

最佳答案

你不能做这样的事情,至少不能 flutter 。由于 dart:mirror 被禁用并且类构造函数没有接口(interface)。

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

我建议改用 POO。您将在这里放弃从 BaseResponse 反序列化 responseObject。然后让 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"});

关于json - Flutter - 如何将嵌套的 json 解析为具有泛型的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51575371/

相关文章:

json - 如何读取多个json文件

java - java中如何使用正则表达式捕获字符串中的内容

c# - 泛型问题

具有两种类型的 C 泛型选择

java - Hibernate 映射与动态查询

wcf - 是否可以让 WCF DataServices JSON 结果始终返回 camelCase?

json - 与 JQ 的值(value)图

java - 在 JAVA 中使用 Path 值创建 JSON 结构

python - 使用 Python 解析(可能是非标准的)XML

parsing - 如何通过 org-element 优雅地解析 org-mode