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就会直接失败,抛出异常。
给大家几个亲测有效的解决办法:
- 手动统一转换类型:在解析的时候先匹配通用的
num类型(包含int和double),再转成double。修改switch里的price匹配逻辑:
'price': num price,
然后在创建Product实例时做转换:
price: price.toDouble(),
这样不管数据库返回的是整数还是小数,都能正常转成我们需要的double类型,兼容性拉满。
调整数据库字段类型:如果项目还在初期,可以让后端把数据库里的price字段改成
DECIMAL(10,2)或者DOUBLE类型,这样返回的JSON里price就是标准的小数类型,解析时就能直接匹配double了。不过这个方法需要后端配合修改,适合能协调资源的场景。分情况匹配处理:在switch里对price做分支判断,同时兼容int和double类型:
{ // 其他字段不变 'price': int priceInt || double priceDouble, } => Product( // 其他参数不变 price: priceInt?.toDouble() ?? priceDouble, ),
这种写法更精准,但代码复杂度会稍高一点,适合需要明确区分两种输入场景的情况。
我自己先用了第一种方法,已经能正常解析数据了,各位如果有其他更巧妙的思路也欢迎留言分享!
内容来源于stack exchange
相关产品推荐
相关产品推荐

