Flutter中如何解析Appwrite返回的DocumentList实例为JSON格式?
在Flutter中处理Appwrite的DocumentList并解析响应
直接访问DocumentList的原始数据
Appwrite返回的DocumentList是封装好的实体类,并非原生JSON对象,你可以直接访问它的公开属性获取数据:
修改你的请求代码,直接读取total和documents属性:
import 'package:appwrite/appwrite.dart'; void main() { Client client = Client(); Databases databases = Databases(client); client .setEndpoint('https://cloud.appwrite.io/v1') .setProject('5df5acd0d48c2') ; databases.listDocuments( databaseId: '[DATABASE_ID]', collectionId: '[COLLECTION_ID]', ).then((documentList) { // 获取总文档数 print('总文档数量: ${documentList.total}'); // 遍历每个文档,访问系统字段和自定义字段 for (var doc in documentList.documents) { // Appwrite内置的系统字段 print('文档ID: ${doc.$id}'); print('创建时间: ${doc.$createdAt}'); // 自定义字段(你在Appwrite控制台定义的字段) print('自定义字段示例: ${doc.data['your_custom_field']}'); } }).catchError((error) { print(error.response); }); }
创建自定义模型类处理文档数据
如果需要类型安全的规范处理,可以创建自定义模型类,将Appwrite的Document实例转换为自己的模型:
1. 定义自定义模型类
class CustomDocument { final String id; final String collectionId; final String databaseId; final DateTime createdAt; final DateTime updatedAt; final List<String> permissions; // 添加你的自定义字段,示例: // final String title; // final int viewCount; CustomDocument({ required this.id, required this.collectionId, required this.databaseId, required this.createdAt, required this.updatedAt, required this.permissions, // 自定义字段参数 // required this.title, // required this.viewCount, }); // 从Appwrite的Document实例转换为自定义模型 factory CustomDocument.fromAppwriteDocument(Document doc) { return CustomDocument( id: doc.$id, collectionId: doc.$collectionId, databaseId: doc.$databaseId, createdAt: DateTime.parse(doc.$createdAt), updatedAt: DateTime.parse(doc.$updatedAt), permissions: doc.$permissions, // 映射自定义字段 // title: doc.data['title'] as String, // viewCount: doc.data['view_count'] as int, ); } // 将自定义模型转换为JSON格式的Map Map<String, dynamic> toJson() { return { '$id': id, '$collectionId': collectionId, '$databaseId': databaseId, '$createdAt': createdAt.toIso8601String(), '$updatedAt': updatedAt.toIso8601String(), '$permissions': permissions, // 加入自定义字段 // 'title': title, // 'view_count': viewCount, }; } }
2. 在请求中使用自定义模型
import 'package:appwrite/appwrite.dart'; import 'dart:convert'; // 用于JSON序列化 void main() { Client client = Client(); Databases databases = Databases(client); client .setEndpoint('https://cloud.appwrite.io/v1') .setProject('5df5acd0d48c2') ; databases.listDocuments( databaseId: '[DATABASE_ID]', collectionId: '[COLLECTION_ID]', ).then((documentList) { // 将Appwrite文档列表转换为自定义模型列表 List<CustomDocument> customDocs = documentList.documents .map((doc) => CustomDocument.fromAppwriteDocument(doc)) .toList(); // 输出单个文档的JSON字符串 print(jsonEncode(customDocs.first.toJson())); // 输出整个文档列表的JSON结构字符串 print(jsonEncode({ 'total': documentList.total, 'documents': customDocs.map((doc) => doc.toJson()).toList() })); }).catchError((error) { print(error.response); }); }
关键注意点
- Appwrite的
Document类中,带$前缀的(如$id、$createdAt)是系统内置字段,直接通过属性访问;自定义字段需从doc.data这个Map中获取 - 如果仅需快速获取自定义字段的JSON数据,直接使用
doc.data即可,它本身就是可序列化的Map - 若要将整个
DocumentList转换为完整JSON结构,需手动构建包含total和documents的Map,再通过jsonEncode转换为字符串
内容的提问来源于stack exchange,提问作者ankushlokhande
相关产品推荐
相关产品推荐

