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
相关产品推荐
相关产品推荐

