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

