Flutter中使用jsonSerializable将DateTime转换为Timestamp
在Flutter中让json_serializable将DateTime转为Timestamp而非字符串
默认情况下,json_serializable会把DateTime类型序列化为字符串。要改成转为Timestamp(以Firebase的Timestamp为例),可以通过自定义JsonConverter实现:
1. 确保依赖齐全
在pubspec.yaml中添加必要依赖:
dependencies: json_annotation: ^4.8.1 cloud_firestore: ^4.14.0 # 若使用Firebase Timestamp dev_dependencies: json_serializable: ^6.7.1 build_runner: ^2.4.6
2. 自定义Timestamp转换器
创建一个转换器类,处理DateTime和Timestamp之间的双向转换:
import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:json_annotation/json_annotation.dart'; class TimestampConverter implements JsonConverter<DateTime, Timestamp> { const TimestampConverter(); @override DateTime fromJson(Timestamp timestamp) => timestamp.toDate(); @override Timestamp toJson(DateTime date) => Timestamp.fromDate(date); }
3. 在模型类中应用转换器
修改你的Task类,添加序列化注解并应用转换器:
import 'package:json_annotation/json_annotation.dart'; part 'task.g.dart'; // 类级别应用转换器,所有DateTime字段都会使用该规则 @JsonSerializable() @TimestampConverter() class Task { final DateTime dateTime; final String taskName; Task({ required this.dateTime, required this.taskName, }); // 自动生成的序列化/反序列化方法 factory Task.fromJson(Map<String, dynamic> json) => _$TaskFromJson(json); Map<String, dynamic> toJson() => _$TaskToJson(json); }
如果只想给单个DateTime字段应用转换,也可以直接在字段上标注:
@JsonSerializable() class Task { @TimestampConverter() // 仅该字段使用转换器 final DateTime dateTime; final String taskName; // ... 构造方法和序列化方法 }
4. 生成序列化代码
执行以下命令生成对应的.g文件:
flutter pub run build_runner build
这样处理后,调用toJson()时dateTime会被转为Timestamp对象,而反序列化时Timestamp会转回DateTime,不再是默认的字符串格式。
内容的提问来源于stack exchange,提问作者Rahul Kavati
相关产品推荐
相关产品推荐

