在Swift中,我习惯于设置一个定义init?(json: JSON)
的protocol JSONInitializable
,这意味着所有符合该协议的类和结构都可以使用JSON对象进行初始化。
这在Dart (使用abstract class
)中是不可能的,因为静态方法和工厂初始化器不是从抽象类继承的,是真的吗?
我问的原因是因为我正在为API GET请求编写许多类似的方法,这些方法可以很容易地合并为一个,例如:
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()
初始化器的协议/接口。
发布于 2020-07-31 01:03:42
您需要的功能在Dart中不可用(或计划),但已对其进行了讨论。
发布于 2021-03-10 17:00:16
一种手动的解决方法是使用序列化程序的映射,例如:
//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的实际代码不是存储在对象本身中,而是存储在生成的类中,从而将序列化反序列化的响应性从对象推送到生成的代码中(以解耦的方式)。
对我的建议持保留态度,因为这两种方法都会丢失静态类型检查,即类型是否具有已注册的映射器以及是否可以转换。
https://stackoverflow.com/questions/53709688
复制相似问题