Flutter中jsonEncode转换TransactionModel列表编码失败求助
问题解决:TransactionModel列表转JSON失败
错误原因
你遇到的Converting object to an encodable object failed: Instance of 'TransactionModel'错误,本质是**DateTime类型无法被jsonEncode默认序列化**——你的TransactionModel.toJson()方法直接返回了date(DateTime实例),而Dart的默认JSON编码器不支持这种类型,进而导致整个列表的序列化失败。
解决方案
方案1:修改toJson方法,将DateTime转为可序列化的字符串
在TransactionModel的toJson方法中,把date转换为ISO 8601格式的字符串(这是JSON中存储日期的标准方式):
class TransactionModel { String id; bool isexpense; DateTime date; double amount; TransactionModel({ this.amount = 0.00, required this.id, this.isexpense = true, required this.date, }); Map<String, dynamic> toJson() { return { 'id': id, 'isexpense': isexpense, 'date': date.toIso8601String(), // 转为ISO字符串 'amount': amount, }; } }
之后直接使用jsonEncode即可正常序列化列表:
void main() { List<TransactionModel> trans = [ TransactionModel( date: DateTime.now(), id: '1', ), ]; String result = jsonEncode(trans); print(result); }
如果之后需要把JSON字符串转回TransactionModel实例,在对应的fromJson方法中可以通过DateTime.parse()把字符串转回来:
factory TransactionModel.fromJson(Map<String, dynamic> json) { return TransactionModel( id: json['id'], isexpense: json['isexpense'], date: DateTime.parse(json['date']), amount: json['amount'], ); }
方案2:给jsonEncode传入自定义编码器
如果不想修改toJson方法,可以在调用jsonEncode时,通过toEncodable参数指定如何处理DateTime类型:
void main() { List<TransactionModel> trans = [ TransactionModel( date: DateTime.now(), id: '1', ), ]; String result = jsonEncode( trans, toEncodable: (object) { if (object is DateTime) { return object.toIso8601String(); } // 对于TransactionModel类型,调用其toJson方法 if (object is TransactionModel) { return object.toJson(); } // 默认行为,抛出错误 throw JsonUnsupportedObjectError(object); }, ); print(result); }
这种方式更灵活,适合不想改动原有模型类的场景。
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

