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

添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:18:01