jsonUtils.dart 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. import 'dart:convert';
  2. class JsonUtils {
  3. static String encodeJson(Object? value, {
  4. Object? Function(dynamic object)? toEncodable,
  5. }) {
  6. return json.encode(value, toEncodable: toEncodable);
  7. }
  8. static dynamic decodeJson(String source, {
  9. Object? Function(Object? key, Object? value)? reviver,
  10. }) {
  11. return json.decode(source, reviver: reviver);
  12. }
  13. static String getString(Map? map, String key, {String defaultValue = ''}) {
  14. if (map == null || !map.containsKey(key)) return defaultValue;
  15. final value = map[key];
  16. if (value == null) return defaultValue;
  17. return value.toString();
  18. }
  19. static String? tryGetString(Map? map, String key) {
  20. if (map == null || !map.containsKey(key)) return null;
  21. final value = map[key];
  22. if (value == null) return null;
  23. return value.toString();
  24. }
  25. static int getInt(Map? map, String key, {int defaultValue = 0}) {
  26. if (map == null || !map.containsKey(key)) return defaultValue;
  27. final value = map[key];
  28. if (value == null) return defaultValue;
  29. if (value is int) return value;
  30. return int.tryParse(value.toString()) ?? defaultValue;
  31. }
  32. static int? tryGetInt(Map? map, String key) {
  33. if (map == null || !map.containsKey(key)) return null;
  34. final value = map[key];
  35. if (value == null) return null;
  36. if (value is int) return value;
  37. return int.tryParse(value.toString());
  38. }
  39. static DateTime getDateTime(Map? map, String key) {
  40. DateTime defaultValue = DateTime.now();
  41. if (map == null || !map.containsKey(key)) return defaultValue;
  42. final value = map[key];
  43. if (value == null) return defaultValue;
  44. if (value is int) return DateTime.fromMillisecondsSinceEpoch(value);
  45. if (value is String) {
  46. final timestamp = int.tryParse(value);
  47. if (timestamp != null) {
  48. return DateTime.fromMillisecondsSinceEpoch(timestamp);
  49. }
  50. }
  51. final dateTime = DateTime.tryParse(value.toString());
  52. return dateTime ?? defaultValue;
  53. }
  54. static DateTime? tryGetDateTime(Map? map, String key) {
  55. DateTime? defaultValue;
  56. if (map == null || !map.containsKey(key)) return defaultValue;
  57. final value = map[key];
  58. if (value == null) return defaultValue;
  59. if (value is int) return DateTime.fromMillisecondsSinceEpoch(value);
  60. if (value is String) {
  61. final timestamp = int.tryParse(value);
  62. if (timestamp != null) {
  63. return DateTime.fromMillisecondsSinceEpoch(timestamp);
  64. }
  65. }
  66. final dateTime = DateTime.tryParse(value.toString());
  67. return dateTime ?? defaultValue;
  68. }
  69. /// ==================== Enum 通用转换方法 ====================
  70. /// 将枚举值转换为字符串
  71. /// 示例:
  72. /// enum Status { active, inactive }
  73. /// String json = JsonUtils.enumToJson(Status.active); // "active"
  74. ///
  75. static String enumToJson<T extends Enum>(T value) {
  76. return value.name;
  77. }
  78. /// 将字符串转换为枚举值(带默认值)
  79. ///
  80. /// 参数:
  81. /// - [values]: 枚举的所有值,通过 EnumType.values 传入
  82. /// - [name]: 要转换的字符串
  83. /// - [defaultValue]: 解析失败时的默认值
  84. /// 示例:
  85. /// enum ApiVersion { v1, v2, v3 }
  86. /// var version = JsonUtils.jsonToEnum(
  87. /// ApiVersion.values,
  88. /// 'v2',
  89. /// defaultValue: ApiVersion.v1,
  90. /// );
  91. ///
  92. static T jsonToEnum<T extends Enum>(List<T> values, String? name, {
  93. required T defaultValue,
  94. }) {
  95. if (name == null || name.isEmpty) {
  96. return defaultValue;
  97. }
  98. return values.firstWhere(
  99. (e) => e.name.toLowerCase() == name.toLowerCase(),
  100. orElse: () => defaultValue,
  101. );
  102. }
  103. /// 将字符串转换为可空的枚举值(解析失败返回 null)
  104. /// 示例:
  105. /// enum Priority { low, medium, high } /// var priority = JsonUtils.tryJsonToEnum(Priority.values, 'medium'); ///
  106. static T? tryJsonToEnum<T extends Enum>(List<T> values, String? name) {
  107. if (name == null || name.isEmpty) {
  108. return null;
  109. }
  110. return values.firstWhere(
  111. (e) => e.name.toLowerCase() == name.toLowerCase(),
  112. orElse: () => throw StateError('No matching enum value'),
  113. );
  114. }
  115. /// 从 Map 中安全地获取枚举值(带默认值)
  116. /// 示例:
  117. /// var apiVersion = JsonUtils.getEnumFromMap(
  118. /// map,
  119. /// 'api_version',
  120. /// ApiVersion.values,
  121. /// defaultValue: ApiVersion.v1,
  122. /// );
  123. ///
  124. static T getEnumFromMap<T extends Enum>(
  125. Map? map,
  126. String key,
  127. List<T> values, {
  128. required T defaultValue,
  129. }) {
  130. if (map == null || !map.containsKey(key)) {
  131. return defaultValue;
  132. }
  133. final name = map[key]?.toString();
  134. return jsonToEnum(values, name, defaultValue: defaultValue);
  135. }
  136. /// 从 Map 中安全地获取可空的枚举值
  137. /// 示例:
  138. /// var priority = JsonUtils.tryGetEnumFromMap(
  139. /// map,
  140. /// 'priority',
  141. /// Priority.values,
  142. /// );
  143. ///
  144. static T? tryGetEnumFromMap<T extends Enum>(
  145. Map? map,
  146. String key,
  147. List<T> values,
  148. ) {
  149. if (map == null || !map.containsKey(key)) {
  150. return null;
  151. }
  152. final name = map[key]?.toString();
  153. return tryJsonToEnum(values, name);
  154. }
  155. /// 将枚举值按索引转换为整数
  156. /// 示例:
  157. /// int index = JsonUtils.enumToInt(Status.active); // 0
  158. ///
  159. static int enumToInt<T extends Enum>(T value) {
  160. return value.index;
  161. }
  162. /// 将整数转换为枚举值(带默认值)
  163. /// 示例:
  164. /// var status = JsonUtils.intToEnum(
  165. /// Status.values,
  166. /// 1,
  167. /// defaultValue: Status.inactive,
  168. /// );
  169. ///
  170. static T intToEnum<T extends Enum>(
  171. List<T> values,
  172. int? index, {
  173. required T defaultValue,
  174. }) {
  175. if (index == null || index < 0 || index >= values.length) {
  176. return defaultValue;
  177. }
  178. return values.elementAt(index);
  179. }
  180. /// 从 Map 中安全地获取枚举值(通过整数索引)
  181. /// 示例:
  182. /// var status = JsonUtils.getEnumFromMapByInt(
  183. /// map,
  184. /// 'status_index',
  185. /// Status.values,
  186. /// defaultValue: Status.inactive,
  187. /// );
  188. ///
  189. static T getEnumFromMapByInt<T extends Enum>(
  190. Map? map,
  191. String key,
  192. List<T> values, {
  193. required T defaultValue,
  194. }) {
  195. if (map == null || !map.containsKey(key)) {
  196. return defaultValue;
  197. }
  198. final index = getInt(map, key, defaultValue: -1);
  199. return intToEnum(values, index, defaultValue: defaultValue);
  200. }
  201. /// ==================== DateTime 转换 ====================
  202. /// int timestamp = JsonUtils.dateTimeToTimestamp(DateTime.now());
  203. /// // 例如: 1712134567890
  204. ///
  205. static int dateTimeToTimestamp(DateTime dateTime) {
  206. return dateTime.millisecondsSinceEpoch;
  207. }
  208. /// 将毫秒时间戳转换为 DateTime
  209. ///
  210. /// 参数:
  211. /// - [timestamp]: 毫秒时间戳
  212. ///
  213. /// 示例:
  214. /// DateTime date = JsonUtils.timestampToDateTime(1712134567890);
  215. ///
  216. static DateTime timestampToDateTime(int timestamp) {
  217. return DateTime.fromMillisecondsSinceEpoch(timestamp);
  218. }
  219. /// 将 DateTime 转换为秒时间戳(整数)
  220. ///
  221. /// 示例:
  222. ///
  223. /// int timestamp = JsonUtils.dateTimeToTimestampSeconds(DateTime.now());
  224. /// // 例如: 1712134567
  225. ///
  226. static int dateTimeToTimestampSeconds(DateTime dateTime) {
  227. return dateTime.millisecondsSinceEpoch ~/ 1000;
  228. }
  229. /// 将秒时间戳转换为 DateTime
  230. ///
  231. /// 参数:
  232. /// - [timestamp]: 秒时间戳
  233. ///
  234. /// 示例:
  235. ///
  236. /// DateTime date = JsonUtils.timestampSecondsToDateTime(1712134567);
  237. ///
  238. static DateTime timestampSecondsToDateTime(int timestamp) {
  239. return DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
  240. }
  241. /// 将 DateTime 转换为 ISO 8601 格式的字符串
  242. ///
  243. /// 示例:
  244. ///
  245. /// String iso = JsonUtils.dateTimeToIsoString(DateTime.now());
  246. /// // 例如: "2024-04-03T10:30:00.000Z"
  247. ///
  248. static String dateTimeToIsoString(DateTime dateTime) {
  249. return dateTime.toIso8601String();
  250. }
  251. /// 将 ISO 8601 格式的字符串转换为 DateTime
  252. ///
  253. /// 参数:
  254. /// - [isoString]: ISO 8601 格式的时间字符串
  255. /// - [defaultValue]: 解析失败时的默认值
  256. ///
  257. /// 示例:
  258. /// DateTime date = JsonUtils.isoStringToDateTime("2024-04-03T10:30:00.000Z");
  259. ///
  260. static DateTime isoStringToDateTime(
  261. String? isoString, {
  262. DateTime? defaultValue,
  263. }) {
  264. if (isoString == null || isoString.isEmpty) {
  265. return defaultValue ?? DateTime.now();
  266. }
  267. final dateTime = DateTime.tryParse(isoString);
  268. return dateTime ?? (defaultValue ?? DateTime.now());
  269. }
  270. /// 将可空的 ISO 8601 字符串转换为可空的 DateTime
  271. /// 示例:
  272. /// DateTime? date = JsonUtils.tryIsoStringToDateTime("2024-04-03T10:30:00.000Z");
  273. ///
  274. static DateTime? tryIsoStringToDateTime(String? isoString) {
  275. if (isoString == null || isoString.isEmpty) {
  276. return null;
  277. }
  278. return DateTime.tryParse(isoString);
  279. }
  280. /// 从 Map 中安全地获取时间戳并转换为 DateTime(带默认值)
  281. ///
  282. /// 参数:
  283. /// - [map]: 数据 Map
  284. /// - [key]: 时间戳字段的 key
  285. /// - [defaultValue]: 解析失败时的默认值
  286. /// - [isSeconds]: 是否为秒时间戳(默认为 false,即毫秒时间戳)
  287. ///
  288. /// 示例:
  289. /// DateTime createTime = JsonUtils.getDateTimeFromMap( /// map, /// 'create_time', /// defaultValue: DateTime.now(), /// ); ///
  290. static DateTime getDateTimeFromMap(
  291. Map? map,
  292. String key, {
  293. DateTime? defaultValue,
  294. bool isSeconds = false,
  295. }) {
  296. if (map == null || !map.containsKey(key)) {
  297. return defaultValue ?? DateTime.now();
  298. }
  299. final value = map[key];
  300. if (value == null) {
  301. return defaultValue ?? DateTime.now();
  302. }
  303. // 如果已经是 DateTime 类型,直接返回
  304. if (value is DateTime) {
  305. return value;
  306. }
  307. // 尝试解析为整数时间戳
  308. int timestamp;
  309. if (value is int) {
  310. timestamp = value;
  311. } else if (value is String) {
  312. final parsed = int.tryParse(value);
  313. if (parsed == null) {
  314. // 如果不是数字,尝试作为 ISO 字符串解析
  315. return isoStringToDateTime(value, defaultValue: defaultValue);
  316. }
  317. timestamp = parsed;
  318. } else {
  319. return defaultValue ?? DateTime.now();
  320. }
  321. // 根据时间戳类型转换
  322. if (isSeconds) {
  323. return timestampSecondsToDateTime(timestamp);
  324. } else {
  325. return timestampToDateTime(timestamp);
  326. }
  327. }
  328. /// 从 Map 中安全地获取时间戳并转换为可空的 DateTime
  329. /// 示例:
  330. /// DateTime? updateTime = JsonUtils.tryGetDateTimeFromMap(map, 'update_time'); ///
  331. static DateTime? tryGetDateTimeFromMap(
  332. Map? map,
  333. String key, {
  334. bool isSeconds = false,
  335. }) {
  336. if (map == null || !map.containsKey(key)) {
  337. return null;
  338. }
  339. final value = map[key];
  340. if (value == null) {
  341. return null;
  342. }
  343. // 如果已经是 DateTime 类型,直接返回
  344. if (value is DateTime) {
  345. return value;
  346. }
  347. // 尝试解析为整数时间戳
  348. int timestamp;
  349. if (value is int) {
  350. timestamp = value;
  351. } else if (value is String) {
  352. final parsed = int.tryParse(value);
  353. if (parsed == null) {
  354. // 如果不是数字,尝试作为 ISO 字符串解析
  355. return tryIsoStringToDateTime(value);
  356. }
  357. timestamp = parsed;
  358. } else {
  359. return null;
  360. }
  361. // 根据时间戳类型转换
  362. if (isSeconds) {
  363. return timestampSecondsToDateTime(timestamp);
  364. } else {
  365. return timestampToDateTime(timestamp);
  366. }
  367. }
  368. }