首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dart:具有.fromJson构造函数的泛型

Dart:具有.fromJson构造函数的泛型
EN

Stack Overflow用户
提问于 2018-12-11 00:25:07
回答 2查看 1.6K关注 0票数 11

在Swift中,我习惯于设置一个定义init?(json: JSON)protocol JSONInitializable,这意味着所有符合该协议的类和结构都可以使用JSON对象进行初始化。

这在Dart (使用abstract class)中是不可能的,因为静态方法和工厂初始化器不是从抽象类继承的,是真的吗?

我问的原因是因为我正在为API GET请求编写许多类似的方法,这些方法可以很容易地合并为一个,例如:

代码语言:javascript
运行
复制
static Future<T> get<T extends JSONInitializable>(int id) async {
  final resourceName = T; // TODO: transform to snake case
  final uri = Uri.parse("$kApiHostname/api/$resourceName/$id");

  final response = await _secureGet(uri);
  if (response == null) {
    return null;
  }

  final responseJson = json.decode(response.body);
  final model = T.fromJson(responseJson);

  return model;
}

但要让它正常工作,我需要将T限制为定义.fromJson()初始化器的协议/接口。

EN

回答 2

Stack Overflow用户

发布于 2020-07-31 01:03:42

您需要的功能在Dart中不可用(或计划),但已对其进行了讨论。

对这个问题竖起大拇指:https://github.com/dart-lang/language/issues/356

票数 1
EN

Stack Overflow用户

发布于 2021-03-10 17:00:16

一种手动的解决方法是使用序列化程序的映射,例如:

代码语言:javascript
运行
复制
//Register object 1 in singleton
  JsonMapper.register<MyObject>(JsonObjectMapper(
    (mapper, map) => MyObject.fromJson(map),
    (mapper, instance) => instance.toJson(),
  ));
//Register object 2 in singleton...
...

这样,您就可以反序列化和序列化您的对象,只要您已经注册了它们,而不是求助于它的泛型类型。

自动(从技术上讲是代码生成)的方法是使用像simple_json这样的包来帮助您通过少量的代码生成来解决这个问题,这样您就不会搞砸注册和消除映射器。

最大的优点是,将对象从JSON转换为JSON的实际代码不是存储在对象本身中,而是存储在生成的类中,从而将序列化反序列化的响应性从对象推送到生成的代码中(以解耦的方式)。

对我的建议持保留态度,因为这两种方法都会丢失静态类型检查,即类型是否具有已注册的映射器以及是否可以转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53709688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档