使用mongo_dart时Int64类型无法转JSON的问题及解决疑问
解决mongo_dart中Int64类型无法jsonEncode的问题
下面提供几种可行的解决思路,你可以根据业务场景选择:
方案1:递归转换所有Int64为原生int(推荐)
JSON原生支持数字类型,将Int64转成Dart原生int既能正常序列化,又能保留数值类型特性。写一个递归遍历函数处理嵌套的Map和List:
dynamic convertInt64ToNative(dynamic data) { if (data is Map<String, dynamic>) { return data.map((key, value) => MapEntry(key, convertInt64ToNative(value))); } else if (data is List) { return data.map((item) => convertInt64ToNative(item)).toList(); } else if (data is Int64) { return data.toInt(); } else { return data; } }
使用示例:
var mongoData = await collection.findOne(); var encodableData = convertInt64ToNative(mongoData); var jsonString = jsonEncode(encodableData);
方案2:将Int64转为String序列化
如果你的数值可能超过Dart原生int的范围(大于2^63-1),转成String可以避免精度丢失,修改转换函数即可:
dynamic convertInt64ToString(dynamic data) { if (data is Map<String, dynamic>) { return data.map((key, value) => MapEntry(key, convertInt64ToString(value))); } else if (data is List) { return data.map((item) => convertInt64ToString(item)).toList(); } else if (data is Int64) { return data.toString(); } else { return data; } }
注意:后续使用该字段时需要手动转回Int64或int类型。
方案3:自定义JSON编码器
通过扩展JsonEncoder直接处理Int64类型,无需提前转换整个数据结构:
class Int64Encoder extends JsonEncoder { const Int64Encoder(); @override dynamic convert(dynamic object) { if (object is Int64) { return object.toInt(); // 需要转String就换成toString() } else if (object is Map) { return object.map((key, value) => MapEntry(convert(key), convert(value))); } else if (object is Iterable) { return object.map(convert).toList(); } return super.convert(object); } }
使用示例:
var jsonString = const Int64Encoder().convert(mongoData);
选择建议
- 绝大多数场景优先选方案1,保持数值类型一致性,后续解析无需额外处理。
- 超大整数场景选方案2,避免精度丢失。
- 不想提前修改数据结构,选方案3更优雅。
内容的提问来源于stack exchange,提问作者Sittiphan Sittisak
相关产品推荐
相关产品推荐

