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

Flutter中解析JSON时将Price类型从Int改为Double出现FormatException的问题求助

Flutter中解析JSON时将Price类型从Int改为Double出现FormatException的问题求助

各位好,我最近在做Flutter项目时遇到了一个JSON解析的棘手问题,想请大家帮忙出出主意:

我从MySQL服务器拉取数据并解析成JSON时,只要把Product类里的price字段类型设为double,就会抛出FormatException;但如果改成int类型就完全正常。可价格数据肯定得支持小数啊,总不能都用整数来存吧。

下面是我的Product类代码:

class Product {
  final int mid;
  final String icode;
  final String name;
  final String description;
  final double price;
  final int gid;
  final String gname;
  final String pic;
  int quantity;

  Product({
    required this.mid,
    required this.icode,
    required this.name,
    required this.description,
    required this.price,
    required this.gid,
    required this.gname,
    required this.pic,
    required this.quantity,
  });

  factory Product.fromJson(Map<String, dynamic> json) {
    return switch (json) {
      {
        'mid': int mid,
        'icode': String icode,
        'name': String name,
        'description': String description,
        'price': double price,
        'gid': int gid,
        'gname': String gname,
        'pic': String pic,
        'quantity': int quantity,
      } =>
        Product(
          mid: mid,
          icode: icode,
          name: name,
          description: description,
          price: price,
          gid: gid,
          gname: gname,
          pic: pic,
          quantity: quantity,
        ),
      _ => throw const FormatException('Failed to load Product.'),
    };
  }
}

我整理的问题原因和可行解决方案

后来琢磨了下,大概率是MySQL返回的价格数据本质是整数类型(比如数据库里存的是INT,或者DECIMAL但没有小数位),而Flutter的JSON解析器不会自动把int转成double,所以在switch表达式里硬匹配double price就会直接失败,抛出异常。

给大家几个亲测有效的解决办法:

  1. 手动统一转换类型:在解析的时候先匹配通用的num类型(包含int和double),再转成double。修改switch里的price匹配逻辑:
'price': num price,

然后在创建Product实例时做转换:

price: price.toDouble(),

这样不管数据库返回的是整数还是小数,都能正常转成我们需要的double类型,兼容性拉满。

  1. 调整数据库字段类型:如果项目还在初期,可以让后端把数据库里的price字段改成DECIMAL(10,2)或者DOUBLE类型,这样返回的JSON里price就是标准的小数类型,解析时就能直接匹配double了。不过这个方法需要后端配合修改,适合能协调资源的场景。

  2. 分情况匹配处理:在switch里对price做分支判断,同时兼容int和double类型:

{
  // 其他字段不变
  'price': int priceInt || double priceDouble,
} => Product(
  // 其他参数不变
  price: priceInt?.toDouble() ?? priceDouble,
),

这种写法更精准,但代码复杂度会稍高一点,适合需要明确区分两种输入场景的情况。

我自己先用了第一种方法,已经能正常解析数据了,各位如果有其他更巧妙的思路也欢迎留言分享!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 09:34:52