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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:04:53