You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:57:16