Dart JSON 解码器

2024-03-23

我很惊讶 dart 没有内置的对象到 json 和 json 到对象映射器。

我读到我们必须自己手动编写映射代码,这并不令人愉快。

无论如何,虽然我还没有针对我的用例彻底测试它,但我发现dart 可导出 https://github.com/Leksat/dart-exportable对我一半的要求很有帮助。

有什么建议的 json 到对象解码包吗?


您最好的选择是使用Smoke https://pub.dartlang.org/packages/smoke图书馆。

它是 Mirrors 功能的子集,但同时具有基于 Mirrors 和基于 Codegen 的实现。它是由 PolymerDart 团队编写的,因此它与我们所得到的最接近“官方”。

在开发过程中,它将使用基于Mirrors的编码/解码;但为了发布,您可以创建一个小型转换器来生成代码。

赛斯·拉德创建代码示例在这里 https://gist.github.com/sethladd/34b0d812b29c3bfd9529,我稍微延长 https://gist.github.com/DanTup/d0b486d276f49da93e74支持子对象:

abstract class Serializable {
  static fromJson(Type t, Map json) {
    var typeMirror = reflectType(t);
    T obj = typeMirror.newInstance(new Symbol(""), const[]).reflectee;
    json.forEach((k, v) {
      if (v is Map) {
        var d = smoke.getDeclaration(t, smoke.nameToSymbol(k));
        smoke.write(obj, smoke.nameToSymbol(k), Serializable.fromJson(d.type, v));
      } else {
        smoke.write(obj, smoke.nameToSymbol(k), v);
      }
    });
    return obj;
  }

  Map toJson() {
    var options = new smoke.QueryOptions(includeProperties: false);
    var res = smoke.query(runtimeType, options);
    var map = {};
    res.forEach((r) => map[smoke.symbolToName(r.name)] = smoke.read(this, r.name));
    return map;
  }
}

目前,Smoke 中不支持获取泛型类型信息(例如支持 List);不过我在这里提出了一个关于此的案例:

https://code.google.com/p/dart/issues/detail?id=20584 https://code.google.com/p/dart/issues/detail?id=20584

在这个问题得到实现之前,“良好”地实现你想要的东西并不是真正可行的;但我希望它能尽快实施;因为做像 JSON 序列化这样基本的事情有点取决于它!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dart JSON 解码器 的相关文章

随机推荐