Dart中如何实现JSON序列化时自动排除null值字段?
Dart 序列化JSON时自动过滤null值字段实现方案
你当前自定义的toJson方法会将所有声明的字段直接放入返回的Map中,无论字段值是否为null,最终生成的JSON自然会包含值为null的字段。要实现null字段自动忽略,有以下几种常用实现方式:
1. 无依赖最简实现(推荐手写场景)
Dart 2.3及以上版本支持在Map字面量内直接使用if条件判断,你可以直接修改toJson方法,仅当字段值非null时才将对应的键值对加入Map:
class SearchFormModel { List<String>? purchaseNumbersList; List<String>? regionsSelectedNames; SearchFormModel({ this.purchaseNumbersList, this.regionsSelectedNames }); Map<String, dynamic> toJson() => { // 字段非null时才会被加入Map if (purchaseNumbersList != null) 'purchaseNumbersList': purchaseNumbersList, if (regionsSelectedNames != null) 'regionsNames': regionsSelectedNames }; }
如果你的Dart版本较低不支持集合内if语法,也可以先创建空Map,再逐字段判断添加:
Map<String, dynamic> toJson() { final Map<String, dynamic> json = {}; if (purchaseNumbersList != null) { json['purchaseNumbersList'] = purchaseNumbersList; } if (regionsSelectedNames != null) { json['regionsNames'] = regionsSelectedNames; } return json; }
以上两种写法效果完全一致:当某个字段值为null时,对应的key不会出现在最终返回的Map中,序列化后的JSON自然不会包含该字段。
2. 使用json_serializable代码生成的场景
如果你是使用官方json_serializable库通过代码生成实现序列化,不需要手动写判空逻辑,只要在类上的注解中开启includeIfNull: false配置,生成的序列化代码会自动过滤所有null值字段:
@JsonSerializable( includeIfNull: false ) class SearchFormModel { List<String>? purchaseNumbersList; List<String>? regionsSelectedNames; SearchFormModel({ this.purchaseNumbersList, this.regionsSelectedNames }); // 生成的toJson方法自带null过滤逻辑 factory SearchFormModel.fromJson(Map<String, dynamic> json) => _$SearchFormModelFromJson(json); Map<String, dynamic> toJson() => _$SearchFormModelToJson(this); }
注意:不要通过给字段设置默认空值(比如空数组、空字符串)的方式规避null,这种方式会让字段始终出现在JSON中,只是值为空,和你要的「null时完全不出现字段」的需求不一致。
内容的提问来源于stack exchange,提问作者Dmitry Bubnenkov
相关产品推荐
相关产品推荐

