Flutter - 带有 Dart 的通用 json 序列化器

Posted

技术标签:

【中文标题】Flutter - 带有 Dart 的通用 json 序列化器【英文标题】:Flutter - Generic json serializer with Dart 【发布时间】:2020-09-25 21:29:19 【问题描述】:

我是 Flutter 的新手,正在尝试实现类似于 Swift 通用可解码的东西,如下所示:

struct ParentJson<T>: Decodable where T: Decodable

经过几个小时的搜索,我发现有 2 个库具有相同的用途 built_value 和 json_annotation 并有一句话说, Dart does not do generic type erasure


我正在尝试解析下面的 json:

 
    "status": 200,
    "message": "This message", 
    "data":  
        "uid": "tested",
        "email": "test@gmail.com",
        "name": "test"
     

在这种情况下,data 可以不同,这就是我想要使数据通用的地方。


built_value generic example T 必须在 addBuilderFactory 中指定为指定类型,正如 David 提到的 here。

而this 是一个带有json_annotation 的官方示例。

这两种方式都完全违反了泛型的概念,因为我需要在父类或序列化器中声明所有不同的类型,而不是简单地编写如下代码:

Parent<User> user = Parent<User>.deserialize(json.decode(jsonString))

所以 Dart 和 Flutter 专家的问题是,

这是 Dart 语言限制吗? 有没有什么方法可以实现解析json的通用值 违反通用概念?

【问题讨论】:

Dart 泛型已被具体化,所以我不认为这是语言限制。 @AluanHaddad,这两个库是 Flutter 团队的 Andrew 和 Matt 推荐的,它处理多个对象状态,这对于避免 Flutter 中的内存泄漏非常重要,但不幸的是我找不到任何使用通用对象解析 json 的在线示例。 很遗憾,我没有任何使用 Flutter 的经验,我只是说应该可以对具体化泛型类型进行操作。 【参考方案1】:

实际上,有适合您用例的解决方案。 这是一个https://github.com/k-paxian/dart-json-mapper 库。

我很确定您正在寻找类似this 的东西。 您会发现工作单元测试说明了您的用例。

【讨论】:

以上是关于Flutter - 带有 Dart 的通用 json 序列化器的主要内容,如果未能解决你的问题,请参考以下文章

使用带有Flutter的完整Dart SDK

Flutter/Dart:我的小部件树中可以有多个带有状态的小部件吗?

Flutter Dart Framework原理简解

Flutter/Dart - 文本值未正确显示

收到推送通知但未显示(Flutter / Dart)

HTTP 请求未在响应中执行 - Flutter/Dart