gpt4 book ai didi

json - Dart中JSON的序列化和反序列化状态

转载 作者:行者123 更新时间:2023-12-01 08:56:44 24 4
gpt4 key购买 nike

我在 C# 上有很好的序列化经验,在搜索和测试了一些 Dart 库之后,我觉得总体上没有一个真正令人满意的答案。

  • 我想知道 Dart 中 JSON 序列化/反序列化的当前状态吗?
  • future 我们应该期待什么?
  • 这最终会得到语言本身的支持吗?
  • 目前的最佳做法是什么?

  • 我也喜欢任何阅读这篇文章的人,请发布任何新信息,即使帖子变旧了。

    最佳答案

    目前,最好的选择可能是使用 Smoke图书馆。

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

    在开发时,它将使用基于镜像的编码/解码;但是对于发布,您可以创建一个将生成代码的小型转换器。

    Seth Ladd 创建 a code sample here , 我 extended slightly支持子对象:

    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

    在这个问题被实现之前,你想要的“好的”实现并不是真正可行的;但我希望它很快就会实现;因为做一些像 JSON 序列化这样基本的事情有点取决于它!

    Alan Knight 也在研究 Serialization 包,但是我发现它缺乏对将日期时间转换为字符串这样简单的事情的支持,而且对于如此基本的事情,解决方案似乎相当冗长。

    现在,在我自己的项目中,我已经使用代码生成我们的 json 序列化(以 toMap 和 fromMap 方法的形式),因为我们已经有了用于服务器端的类的 C# 版本。如果时间允许,我想整理这些代码并制作一个 NuGet 包(它支持嵌套对象、数组、排除属性等)。

    关于json - Dart中JSON的序列化和反序列化状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27135876/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com