Files
Aq-Accounting-Flutter/lib/models/json_util.dart
T
2026-09-23 17:23:59 +08:00

65 lines
2.2 KiB
Dart

/// 后端字段的防御式取值工具
///
/// 后端没有统一的响应包装,字段类型也可能与预期不符(例如金额返回字符串、
/// 数组返回 null)。所有 fromJson 都走这里取值,保证解析绝不抛异常。
library;
int asInt(Object? value, {int fallback = 0}) {
if (value is int) return value;
if (value is num) return value.toInt();
if (value is String) return int.tryParse(value) ?? fallback;
return fallback;
}
/// 取可空整数:null / 无法解析都返回 null
///
/// 用于 folderId 这类"没有值"本身有业务含义的字段
/// (null 表示未分类,不能退化成 0)
int? asNullableInt(Object? value) {
if (value == null) return null;
if (value is int) return value;
if (value is num) return value.toInt();
if (value is String) return int.tryParse(value);
return null;
}
double asDouble(Object? value, {double fallback = 0}) {
if (value is double) return value;
if (value is num) return value.toDouble();
if (value is String) return double.tryParse(value) ?? fallback;
return fallback;
}
String asString(Object? value, {String fallback = ''}) {
if (value == null) return fallback;
return value.toString();
}
/// 取字符串,空串时回退(用于分类名/图标这类必须有值的展示字段)
String asNonEmpty(Object? value, String fallback) {
final text = asString(value);
return text.isEmpty ? fallback : text;
}
/// 取对象数组,非 Map 的元素直接丢弃
List<Map<String, dynamic>> asMapList(Object? value) {
if (value is! List) return const [];
return value.whereType<Map<String, dynamic>>().toList();
}
/// 取字符串数组(用于标签这类场景),非字符串元素丢弃,空串过滤掉
List<String> asStringList(Object? value) {
if (value is! List) return const [];
return value
.map((e) => e?.toString() ?? '')
.where((e) => e.isNotEmpty)
.toList();
}
/// 后端给的是 `yyyy-MM-dd HH:mm:ss`,这里裁成 `yyyy-MM-dd HH:mm`。
/// 列表里显示到秒没有意义,还会把卡片撑宽。
String formatDateTime(Object? value) {
final text = asString(value);
return text.length >= 16 ? text.substring(0, 16) : text;
}