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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 19:27:23