parse method
解析数据
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);
}