如何在Freezed中实现带自定义值的toJson方法?
使用Freezed实现自定义JSON转换
Freezed支持通过注解或自定义逻辑处理JSON序列化的自定义需求,针对你要实现的日期格式化、字段转换场景,有两种常用实现方式:
方法一:单个字段自定义(推荐)
直接在字段上用@JsonKey注解指定序列化逻辑,适合单字段的简单转换:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'your_model.freezed.dart'; part 'your_model.g.dart'; @freezed class YourModel with _$YourModel { const factory YourModel({ // 指定date_installed的序列化格式 @JsonKey(toJson: _formatDateToYmd) required DateTime dateInstalled, @JsonKey(toJson: _formatDateToYmd) required DateTime dateTested, // 把updatedAt转为ISO8601字符串 @JsonKey(toJson: _dateToIsoString) required DateTime updatedAt, required List<String> groups, }) = _YourModel; factory YourModel.fromJson(Map<String, dynamic> json) => _$YourModelFromJson(json); // 自定义日期转YYYY-MM-DD格式 static String _formatDateToYmd(DateTime date) { return "${date.year.toString().padLeft(4, '0')}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}"; } // DateTime转ISO8601字符串 static String _dateToIsoString(DateTime date) => date.toIso8601String(); }
方法二:全局重写toJson方法
如果需要更复杂的全局逻辑,可以扩展Freezed生成的类,手动重写toJson:
// 在模型文件末尾添加扩展 extension YourModelJsonExt on YourModel { @override Map<String, dynamic> toJson() { // 先获取Freezed自动生成的基础JSON结构 final baseJson = _$YourModelToJson(this); // 替换或补充自定义字段 return { ...baseJson, "date_installed": "${dateInstalled.year.toString().padLeft(4, '0')}-${dateInstalled.month.toString().padLeft(2, '0')}-${dateInstalled.day.toString().padLeft(2, '0')}", "date_tested": "${dateTested.year.toString().padLeft(4, '0')}-${dateTested.month.toString().padLeft(2, '0')}-${dateTested.day.toString().padLeft(2, '0')}", "updated_at": updatedAt.toIso8601String(), }; } }
注意要点
- 确保已正确配置Freezed代码生成环境(添加
freezed_annotation、build_runner等依赖) - 如果需要处理反序列化逻辑,可在
@JsonKey的fromJson参数中指定对应的转换函数 - 方法一更贴合Freezed的设计思路,优先推荐;方法二更灵活,适合多字段复杂转换场景
内容的提问来源于stack exchange,提问作者Ogak Dev
相关产品推荐
相关产品推荐

