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

Freezed类中如何根据其他字段控制指定字段的toJson序列化?

实现方案

直接重写类的toJson方法即可,不需要改动你现有的includeIfNull: false配置、ignore忽略函数以及其他字段的序列化规则,实现成本最低:

  • 保留现有所有代码不变,在ProductDto类中新增重写的toJson方法,在默认生成的序列化逻辑基础上,根据variants字段的状态调整id字段的输出行为。
  • 完整可运行代码示例:
T? ignore<T>(dynamic _) => null;

@freezed
class ProductDto with _$ProductDto {
  @JsonSerializable(includeIfNull: false)
  factory ProductDto({
    @JsonKey(name: "_id") required String? id,
    @JsonKey(toJson: ignore) required bool? isValidated,
    required String? category,
    required List<Map<String, dynamic>>? variants,
    required int? quantity,
    @JsonKey(name: "_updatedDate", toJson: ignore) required String? updatedDate,
    required double? price,
  }) = _ProductDto;

  @override
  Map<String, dynamic> toJson() {
    // 调用freezed默认生成的序列化逻辑,保证其他字段规则正常生效
    final jsonData = _$$ProductDtoToJson(this);

    // 判断variants是否为非null的空数组
    final isEmptyVariants = variants?.isEmpty ?? false;

    // 需求逻辑:仅variants为空数组时保留_id字段,其余场景移除该字段
    // 如果实际逻辑相反,只需将判断条件取反即可
    if (!isEmptyVariants) {
      jsonData.remove('_id');
    }

    return jsonData;
  }
}

注意事项

  • 判断空数组时需要先处理variants的可空场景,用variants?.isEmpty ?? false避免空指针异常
  • 移除字段时使用的key是_id,和你@JsonKey配置的序列化后字段名保持一致,不要用类内的字段名id
  • 之前配置的字段忽略、null值不输出的逻辑完全不会受影响,不需要做额外调整

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 15:36:26