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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 19:22:04