Flutter中json_serializable如何全局设置自定义DateTime转换器
全局替换json_serializable的DateTime转换器
要全局替换json_serializable的默认DateTime转换器,你可以通过项目配置文件+自定义转换器的方式实现,具体步骤如下:
1. 编写自定义DateTime转换器
创建一个继承自JsonConverter的类,实现DateTime与目标序列化类型(通常是String)的双向转换。比如要使用yyyy-MM-dd HH:mm:ss格式:
import 'package:json_annotation/json_annotation.dart'; import 'package:intl/intl.dart'; // 支持非空DateTime的转换器 class CustomDateTimeConverter implements JsonConverter<DateTime, String> { const CustomDateTimeConverter(); @override DateTime fromJson(String json) => DateFormat('yyyy-MM-dd HH:mm:ss').parse(json); @override String toJson(DateTime object) => DateFormat('yyyy-MM-dd HH:mm:ss').format(object); } // 可选:支持Nullable DateTime的转换器 class CustomNullableDateTimeConverter implements JsonConverter<DateTime?, String?> { const CustomNullableDateTimeConverter(); @override DateTime? fromJson(String? json) => json != null ? DateFormat('yyyy-MM-dd HH:mm:ss').parse(json) : null; @override String? toJson(DateTime? object) => object != null ? DateFormat('yyyy-MM-dd HH:mm:ss').format(object) : null; }
2. 配置build.yaml全局生效
在项目根目录创建或修改build.yaml文件,将自定义转换器注册为全局转换器,覆盖默认的DateTime处理逻辑:
targets: $default: builders: json_serializable: options: # 注册全局转换器,替换为你自己的包路径和类名 converters: - "package:你的项目名/路径/custom_date_time_converter.dart#CustomDateTimeConverter" # 如果需要支持Nullable,添加下面这行 # - "package:你的项目名/路径/custom_date_time_converter.dart#CustomNullableDateTimeConverter" # 确保未注解的字段也能被处理(可选,根据你的需求调整) ignore_unannotated: false explicit_to_json: true
3. 重新生成序列化代码
运行build_runner命令,让配置生效并重新生成代码:
# Dart项目 dart run build_runner build # Flutter项目 flutter pub run build_runner build
注意事项
- 局部转换器优先级高于全局:如果某个类上单独指定了
@JsonSerializable(converters: [...]),会优先使用局部配置的转换器。 - 确保build.yaml中的包路径和类名完全正确,否则转换器不会生效。
内容的提问来源于stack exchange,提问作者Gemu
相关产品推荐
相关产品推荐

