parse method

  1. @override
PaginatedResult<T> parse(
  1. dynamic rawData
)
override

解析数据 rawData 原始响应数据 返回解析后的目标数据

如果解析失败,应抛出 ParserException

Implementation

@override
PaginatedResult<T> parse(dynamic rawData) {
  if (rawData is! Map<String, dynamic>) {
    throw ParserException('响应数据格式错误,期望 Map 类型', rawData: rawData);
  }

  // 验证状态码
  if (validateStatusCode) {
    final code = rawData[NetworkConstants.fieldCode];
    final isSuccess = _isSuccessCode(code);
    if (code != null && !isSuccess) {
      final message = rawData[NetworkConstants.fieldMessage] ?? '请求失败';
      throw ParserException(
        '业务状态码错误: $message (code: $code)',
        rawData: rawData,
      );
    }
  }

  // 提取数据对象
  if (!rawData.containsKey(dataFieldName)) {
    throw ParserException('响应中不存在字段: $dataFieldName', rawData: rawData);
  }

  final dataObj = rawData[dataFieldName];
  if (dataObj is! Map<String, dynamic>) {
    throw ParserException('字段 $dataFieldName 不是对象类型', rawData: dataObj);
  }

  // 提取列表
  if (!dataObj.containsKey(listFieldName)) {
    throw ParserException('数据对象中不存在列表字段: $listFieldName', rawData: dataObj);
  }

  final list = dataObj[listFieldName];
  if (list is! List) {
    throw ParserException('字段 $listFieldName 不是列表类型', rawData: list);
  }

  // 解析列表项
  final items = list.map((item) => itemParser(item)).toList();

  // 提取分页元数据
  final meta = PaginationMeta(
    currentPage: dataObj[paginationFields['currentPage']] as int?,
    pageSize: dataObj[paginationFields['pageSize']] as int?,
    total: dataObj[paginationFields['total']] as int?,
    totalPages: dataObj[paginationFields['totalPages']] as int?,
    hasNext: dataObj[paginationFields['hasNext']] as bool?,
    hasPrevious: dataObj[paginationFields['hasPrevious']] as bool?,
  );

  return PaginatedResult<T>(items, meta: meta);
}