如何为Flutter Freezed字段自定义蛇形/驼峰/短横线等JSON命名格式?
Flutter Freezed 修改JSON序列化/反序列化字段名方案
在使用Freezed处理JSON序列化时,不管是要给单个字段自定义命名,还是全局统一用蛇形、驼峰这类规则,都有对应的解决方式:
1. 单个字段自定义重命名
如果只是个别字段需要修改JSON键名,直接给字段加上@JsonKey注解指定name参数即可:
import 'package:freezed_annotation/freezed_annotation.dart'; part 'user.freezed.dart'; part 'user.g.dart'; @freezed class User with _$User { const factory User({ // Dart里用驼峰,JSON序列化为user_id @JsonKey(name: 'user_id') required String userId, // JSON序列化为user_name @JsonKey(name: 'user_name') required String userName, required int age, }) = _User; factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); }
生成代码后,序列化时userId会自动转为user_id,反序列化时user_id也能正确映射回userId。
2. 全局统一重命名模式
如果整个类的字段都要遵循统一规则(比如驼峰转蛇形、蛇形转驼峰,或者短横线命名),可以用@JsonSerializable的fieldRename参数批量配置,不用逐个字段加注解:
示例:全局驼峰转蛇形
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:json_annotation/json_annotation.dart'; part 'user.freezed.dart'; part 'user.g.dart'; @freezed @JsonSerializable(fieldRename: FieldRename.snake) class User with _$User { const factory User({ // 自动序列化为user_id required String userId, // 自动序列化为user_name required String userName, required int age, // 字段名本身一致,无需转换 }) = _User; factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json); }
FieldRename支持几种常用规则:
FieldRename.snake: 驼峰转蛇形(userName→user_name)FieldRename.camel: 蛇形转驼峰(user_name→userName)FieldRename.kebab: 驼峰转短横线(userName→user-name)FieldRename.pascal: 首字母大写驼峰(userName→UserName)
最后一步:生成代码
配置完注解后,运行以下命令生成序列化代码:
flutter pub run build_runner build --delete-conflicting-outputs
内容的提问来源于stack exchange,提问作者Mu'aaz Joosuf
相关产品推荐
相关产品推荐

