2013-05-14 25 views
8

我尝试将对象转换为JSON。如何在Dart中将包含DateTime字段的对象转换为JSON?

var obj = { "dt": new DateTime.now() }; 
    var s = stringify(obj); 

运行库引发异常:“在对象上调用toJson方法失败。”

这是因为DateTime类没有toJson方法。 但是我应该怎么做呢?

JavaScript的JSON.stringify函数有一个可选参数替代品这让我提供我自己的,即使对象没有的toJSON方法的对象序列化的方式。 Dart中是否有类似的工具,或者我可以用我自己的toJson方法以某种方式扩展DateTime类?

回答

1

IMO,这是dart:json库中的一个缺陷,stringify不支持额外的回调来序列化缺少toJson实现的类型。奇怪的是,parse函数确实支持reviver参数来自定义反序列化过程。原因可能是用户可以为其类型添加toJson,核心库将照顾“原生”类型,但DateTime被省略(可能是因为JSON中的日期序列化并不是一个真正直接的故事)。

也许团队的目标是使用自定义类型而不是地图(这很好),但是这里的缺点是如果您的自定义类型包含10个其他属性和1是DateTime类型,则需要实现toJson它将所有这些序列化,甚至整数和字符串。希望一旦Mirror API准备就绪,将会有一些库通过读取类型上的反射信息来实现“带外”序列化,请参阅下面的示例。 Dart的承诺是我可以在服务器和客户端上使用我的类型,但是如果我必须手动为我的所有模型实现序列化/反序列化,那么使用它就太尴尬了。

它也没有帮助DateTime本身与格式不太灵活,因为除了toString之外没有其他方法返回对序列化无用的格式。

因此,这里有一些选择:

  • 包裹(或派生)在自己的类型提供toJson
  • 补丁DateTimejson.stringifyJsonValue并提交变更,或者至少提出一个问题:)
  • 使用一些第三方库,如json-object(只是一个例子,它也不支持DateTime序列化,AFAIK

我对他们中的任何人都不满意:)

+1

日期格式在这里http://api.dartlang。org/docs/releases/latest/intl/DateFormat.html将stringify()添加替换函数参数存在一个错误https://code.google.com/p/dart/issues/detail?id=5911 – 2013-05-14 10:50:02

+0

谢谢,不知道它(我检查了核心库,但'intl'必须单独安装)。我想ISO8601/RFC3339格式仍然需要“手动”构建,对吧?也因为他们不是真的'本地化',我不知道他们是否真的适合'intl'。一个好的序列化库是需要的,但我认为在镜像API完成之前没有任何意义。 – 2013-05-14 11:04:05

+0

DateTime对象具有可用于在不尝试解析字符串的情况下提取其数据的字段。或者可以很容易地生成一个硬编码格式的新DateFormat(“yyyy-MM-dd”)来打印ISO表单。它不是本地化的,但它打印你想要的。还有一个序列化库,它可以使用镜像(如果可用),但也可以编写硬编码的规则。它更多的目的是能够将数据读回到飞镖中,而不是生成JSON供其他程序使用。 – 2013-05-14 17:37:47

3

Zdeslav Vojkovic的回答已经过时了。

dart:convert中的JSON.encode()方法有一个可选的toEncodable方法,该方法针对非本机序列化为JSON的对象调用。然后由用户提供一个返回适当的DateTime序列的闭包。

相关问题