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

Flutter使用json_serializable时为null字段自动应用@JsonKey默认值的方法

原因说明

@JsonKey的defaultValue配置仅作用于fromJson反序列化场景,生成的默认值逻辑只会内嵌在json_serializable自动生成的反序列化工厂方法中,手动调用类构造方法时不会触发该配置。

解决方案

方案1:改造构造方法,主动处理默认值(推荐)

通过初始化列表对入参做空判断 fallback 到默认值,不管主动传null还是不传参数,都会自动应用默认值:

@JsonSerializable()
class TestModelA {
  @JsonKey(defaultValue: 'jp')
  final String? language;
  @JsonKey(defaultValue: 'jp')
  final String? location;

  // 初始化列表做空替换,传入null时自动用默认值
  TestModelA(String? language, String? location) :
    language = language ?? 'jp',
    location = location ?? 'jp';

  factory TestModelA.fromJson(Map<String, dynamic> json) =>
      _$TestModelAFromJson(json);

  Map<String, dynamic> toJson() => _$TestModelAToJson(this);
}

如果你的构造是可选参数形式,也可以直接给参数设默认值:

// 命名可选参数
TestModelA({this.language = 'jp', this.location = 'jp'});
// 位置可选参数
TestModelA([this.language = 'jp', this.location = 'jp']);

方案2:统一通过fromJson创建实例,复用已有defaultValue配置

如果不想重复维护两份默认值配置,可以统一走反序列化方法创建实例,自动触发@JsonKey的默认值逻辑:

// 完全用默认值创建实例
final defaultModel = TestModelA.fromJson({});
// 自定义部分字段,剩余字段走默认值
final customModel = TestModelA.fromJson({'location': 'cn'});

如果需要支持json中字段存在但值为null时也应用默认值,需要给@JsonKey增加disallowNullValue: true配置:

@JsonKey(defaultValue: 'jp', disallowNullValue: true)
final String? language;

内容的提问来源于stack exchange,提问作者chichi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:15:03