添加double类型price属性后JsonSerializable反序列化不返回对象如何解决
问题根源
你遇到的问题是接口返回的price字段实际为字符串格式(比如"9.99"),但你在模型中将其声明为double类型。json_serializable默认生成的转换逻辑为(json['price'] as num?)?.toDouble(),字符串类型的值无法通过as num?强转,因此会返回null。
手动修改生成的.g.dart文件的做法不可行,每次执行flutter pub run build_runner build时生成文件都会被覆盖,你需要通过json_serializable提供的注解配置来自定义转换规则。
解决方案
方案1:单字段自定义转换(推荐,适配单个字段的转换需求)
首先在模型所在文件中定义一个兼容的字符串转double的转换函数,再通过@JsonKey的fromJson参数绑定该函数即可:
// 自定义转换函数,兼容数字、字符串、空值三种情况 double? convertToDouble(dynamic value) { if (value == null) return null; if (value is num) return value.toDouble(); if (value is String) return double.tryParse(value); return null; } @JsonSerializable() class Item { @JsonKey(name: 'id') int? id; @JsonKey(name: 'kitchen_id') int? kitchenId; @JsonKey(name: 'kitchen') Kitchen? kitchen; @JsonKey(name: 'name') String? name; @JsonKey(name: 'image') String? image; // 绑定自定义转换函数 @JsonKey(name: 'price', fromJson: convertToDouble) double? price; Item(); factory Item.fromJson(Map<String, dynamic> json) => _$ItemFromJson(json); Map<String, dynamic> toJson() => _$ItemToJson(this); @override String toString() { return '{name: $name}'; } }
修改后重新执行flutter pub run build_runner build,生成的代码会自动调用该转换函数,无需再手动修改生成文件。
方案2:全局转换器(适配大量同类型字段转换需求)
如果你项目中多处存在字符串转double的需求,可以定义全局JsonConverter,统一处理所有double类型字段的转换逻辑,无需逐个绑定转换函数。
内容的提问来源于stack exchange,提问作者Heaven Aldrico
相关产品推荐
相关产品推荐

