在 Flutter 开发中,如果你希望模型转 JSON 时跳过值为 0
的 int
字段 (即不包含该字段),可以通过以下两种方法实现。这里以常用的 json_serializable
库为例:
方法一:使用 JsonKey
注解的 includeIfNull
和自定义 toJson
- 设置
includeIfNull: false
:确保null
值不被包含。 - 自定义
toJson
函数 :将0
转换为null
,这样结合includeIfNull: false
即可跳过。
dart
dart
import 'package:json_annotation/json_annotation.dart';
part 'model.g.dart';
@JsonSerializable()
class MyModel {
@JsonKey(
includeIfNull: false,
toJson: _valueToJson, // 自定义转换函数
)
final int? value;
MyModel({this.value});
factory MyModel.fromJson(Map<String, dynamic> json) =>
_$MyModelFromJson(json);
Map<String, dynamic> toJson() => _$MyModelToJson(this);
// 自定义转换逻辑:0 返回 null,其他保持不变
static dynamic _valueToJson(int? value) => value == 0 ? null : value;
}
方法二:手动重写 toJson
方法(不依赖代码生成)
如果你不想依赖代码生成,可以手动实现 toJson
:
dart
arduino
class MyModel {
final int? value;
MyModel({this.value});
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
// 仅当 value 非 0 且非 null 时才包含
if (value != null && value != 0) {
map['value'] = value;
}
return map;
}
}
补充说明
- 默认值处理 :如果字段为
null
或0
,上述方法会跳过该字段。 - 反序列化注意 :JSON 中缺少的字段在解析时会成为
null
或默认值(如int
字段会是0
),需确保业务逻辑能处理这种情况。
根据你的序列化需求选择合适的方法即可。