如何将Firestore的Timestamp转为JSON?如何查看文档大小?
问题描述
尝试获取Firestore文档大小,计划将文档转换为JSON格式。当文档不含Timestamp字段时可成功转换,但含Timestamp字段时抛出如下错误:
Error: Converting object to an encodable object failed: Instance of 'Timestamp'
尝试的代码如下:
Future<int> getDocumentSize() async { try { QuerySnapshot querySnapshot = await incomeCollectionRef.get(); List<Map<String, dynamic>> serializedDocs = []; if (querySnapshot.docs.isNotEmpty) { serializedDocs = querySnapshot.docs.map((doc) { Map<String, dynamic> data = doc.data() as Map<String, dynamic>; if (data.containsKey('FromDate') && data['FromDate'] is Timestamp) { data['FromDate'] = (data['FromDate'] as Timestamp) .toDate() .toUtc() .toIso8601String(); } return data; }).toList(); } else { print('No documents found.'); } // Convert the document data to a JSON string String jsonData = jsonEncode(serializedDocs); // Calculate the size of the JSON string in bytes int sizeInBytes = utf8.encode(jsonData).length; print(sizeInBytes); return sizeInBytes; } catch (e) { print('Error: $e'); return 0; // Handle the error as needed } }
后续还会添加额外计算,需解决两个问题:
- 如何将Timestamp转换为JSON?
- 是否有查看Firestore文档大小的方法?
解决方案
一、处理Timestamp转JSON的问题
当前代码仅处理了FromDate字段,若文档中存在其他Timestamp类型字段,仍会触发转换失败。提供两种解决方式:
1. 批量遍历转换所有Timestamp字段
遍历文档的每个键值对,统一转换Timestamp类型的值:
serializedDocs = querySnapshot.docs.map((doc) { Map<String, dynamic> data = doc.data() as Map<String, dynamic>; // 遍历所有字段,自动转换Timestamp data.forEach((key, value) { if (value is Timestamp) { data[key] = value.toDate().toUtc().toIso8601String(); } }); return data; }).toList();
2. 自定义JSON编码器
创建自定义编码器,自动识别并转换Timestamp,无需手动遍历字段:
class FirestoreJsonEncoder extends JsonEncoder { FirestoreJsonEncoder() : super((object) { if (object is Timestamp) { return object.toDate().toUtc().toIso8601String(); } return object; }); }
使用时替换原有的jsonEncode:
String jsonData = FirestoreJsonEncoder().convert(serializedDocs);
二、查看Firestore文档大小的方法
Firestore没有直接提供获取文档大小的API,可通过以下两种方式估算:
1. JSON转换计算(当前方式)
将文档转为JSON字符串后计算字节数,这种方式能快速得到近似值,但注意:
- Firestore实际存储会包含额外元数据(如字段名存储开销、Timestamp的原始8字节格式),所以计算结果是近似值
- 若需更精确,可结合官方存储计费规则调整计算逻辑
2. 按官方计费规则手动计算
根据Firestore的存储计费标准,文档大小由三部分组成:
- 所有字段名的UTF-8字节数
- 所有字段值的存储字节数(比如Timestamp占8字节、字符串按UTF-8长度、布尔值占1字节、int64占8字节等)
- 系统固定开销(约32字节/文档)
可遍历文档的每个字段,按类型分别计算各部分字节数,最后求和得到更接近真实存储大小的数值。
内容的提问来源于stack exchange,提问作者developer
相关产品推荐
相关产品推荐

