如何将任意Dart对象序列化为JSON,含第三方库类实例?
解决方案
Dart/Flutter 环境下没有开箱即用的任意对象自动序列化 JSON 的能力,因为 Flutter 禁用了提供反射能力的 dart:mirrors 库,避免导致打包体积大幅膨胀,你可以通过以下两种方式实现需求:
快速实现方法
直接通过扩展方法手动编写序列化逻辑,不需要引入额外依赖,10分钟内即可完成:
import 'dart:convert'; // 嵌套枚举序列化扩展 extension PurchaseStatusJson on PurchaseStatus { String toJson() => name; } // 嵌套错误类序列化扩展 extension IAPErrorJson on IAPError { Map<String, dynamic> toJson() { return { 'code': code, 'message': message, 'details': details, }; } } // 嵌套验证数据类序列化扩展 extension PurchaseVerificationDataJson on PurchaseVerificationData { Map<String, dynamic> toJson() { return { // 可根据该类的实际字段调整下方属性 'localVerificationData': localVerificationData, 'serverVerificationData': serverVerificationData, 'source': source.name, }; } } // PurchaseDetails 主类序列化扩展 extension PurchaseDetailsJson on PurchaseDetails { Map<String, dynamic> toJson() { return { 'purchaseID': purchaseID, 'productID': productID, 'verificationData': verificationData.toJson(), 'transactionDate': transactionDate, 'status': status.toJson(), 'error': error?.toJson(), 'pendingCompletePurchase': pendingCompletePurchase, }; } }
使用时直接调用即可得到JSON字符串:
String jsonStr = jsonEncode(purchaseDetailsInstance.toJson());
第三方类序列化最佳实践
- 少量简单序列化场景优先用扩展方法实现:无需修改第三方库源码,侵入性最低,逻辑独立维护,只要第三方库没有破坏性的字段变更就可以正常使用。
- 复杂多字段/高频序列化场景:可以基于
json_serializable构建对应结构的DTO类,通过build_runner自动生成序列化代码,再补充第三方类到DTO的转换逻辑即可,避免手动写序列化代码容易出现的字段拼写错误、遗漏字段问题。 - 不推荐使用依赖反射实现的通用序列化库:这类库大多不兼容Flutter环境,会带来打包体积增加、运行性能下降的问题,部分场景还会出现不可预期的序列化错误。
内容的提问来源于stack exchange,提问作者Joel Broström
相关产品推荐
相关产品推荐

