如何将DateTime实例正确格式化并编码为JSON格式
Dart DateTime类型JSON序列化方案
问题根因
JSON标准中没有原生的日期时间类型,直接将
DateTime实例放入待序列化的Map中,序列化工具无法识别该非基础类型,因此会运行失败。你编写的代码核心问题就是没有对DateTime做类型转换:DateTime birthdate; Map<String, dynamic> toJson() => { 'birthDate': birthdate, };
可直接使用的修复方案
方案1:转ISO8601标准字符串(优先推荐)
该格式跨语言兼容性强、自带时区信息、精度到微秒,适合绝大多数业务场景,修复后代码如下:DateTime birthdate; Map<String, dynamic> toJson() => { 'birthDate': birthdate.toIso8601String(), };解码时调用
DateTime.parse(json['birthDate'])即可还原为DateTime实例,和你已经掌握的解码逻辑完全匹配。方案2:转数字时间戳(适合数值计算场景)
如果需要频繁对日期做大小对比、或者要压缩传输体积,可以选择转成毫秒/微秒级时间戳:DateTime birthdate; Map<String, dynamic> toJson() => { // 毫秒级时间戳,需要更高精度可替换为microsecondsSinceEpoch 'birthDate': birthdate.millisecondsSinceEpoch, };对应解码方法为
DateTime.fromMillisecondsSinceEpoch(json['birthDate'])。
自动化序列化适配提示
如果项目使用json_serializable这类自动生成序列化代码的库,无需手动编写toJson转换逻辑,只需在字段上添加注解指定转换方法即可:
import 'package:json_annotation/json_annotation.dart'; @JsonSerializable() class User { @JsonKey( fromJson: DateTime.parse, toJson: _dateTimeToIso, ) DateTime birthdate; static String _dateTimeToIso(DateTime date) => date.toIso8601String(); // 其余生成代码省略 }
内容的提问来源于stack exchange,提问作者Markus Handel
相关产品推荐
相关产品推荐

