data_util.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. import json
  2. from typing import Optional, Union, Dict, List
  3. from decimal import Decimal
  4. class DataUtil:
  5. """数据处理工具类"""
  6. @staticmethod
  7. def to_json(data: Union[Dict, List]) -> Optional[str]:
  8. """将数据转换为JSON字符串
  9. Args:
  10. data: 要转换的数据
  11. Returns:
  12. JSON字符串,如果转换失败返回None
  13. """
  14. try:
  15. return json.dumps(data, ensure_ascii=False)
  16. except Exception:
  17. return None
  18. @staticmethod
  19. def from_json(json_str: str) -> Optional[Union[Dict, List]]:
  20. """将JSON字符串转换为Python对象
  21. Args:
  22. json_str: JSON字符串
  23. Returns:
  24. Python对象,如果转换失败返回None
  25. """
  26. try:
  27. return json.loads(json_str)
  28. except Exception:
  29. return None
  30. @staticmethod
  31. def to_decimal(value: Union[str, int, float]) -> Optional[Decimal]:
  32. """将值转换为Decimal类型
  33. Args:
  34. value: 要转换的值
  35. Returns:
  36. Decimal对象,如果转换失败返回None
  37. """
  38. try:
  39. return Decimal(str(value))
  40. except Exception:
  41. return None
  42. @staticmethod
  43. def deep_merge(dict1: Dict, dict2: Dict) -> Dict:
  44. """深度合并两个字典
  45. Args:
  46. dict1: 第一个字典
  47. dict2: 第二个字典
  48. Returns:
  49. 合并后的字典
  50. """
  51. result = dict1.copy()
  52. for key, value in dict2.items():
  53. if key in result and isinstance(result[key], dict) and isinstance(
  54. value, dict):
  55. result[key] = DataUtil.deep_merge(result[key], value)
  56. else:
  57. result[key] = value
  58. return result
  59. @staticmethod
  60. def flatten_dict(d: Dict, parent_key: str = '', sep: str = '.') -> Dict:
  61. """将嵌套字典展平
  62. Args:
  63. d: 要展平的字典
  64. parent_key: 父级键名
  65. sep: 分隔符
  66. Returns:
  67. 展平后的字典
  68. """
  69. items = []
  70. for k, v in d.items():
  71. new_key = f"{parent_key}{sep}{k}" if parent_key else k
  72. if isinstance(v, dict):
  73. items.extend(
  74. DataUtil.flatten_dict(v, new_key, sep=sep).items())
  75. else:
  76. items.append((new_key, v))
  77. return dict(items)
  78. @staticmethod
  79. def get_nested_value(data: Dict, keys: List[str], default=None):
  80. """获取嵌套字典中的值
  81. Args:
  82. data: 要查找的字典
  83. keys: 键名列表
  84. default: 默认值
  85. Returns:
  86. 查找到的值,如果不存在返回默认值
  87. """
  88. for key in keys:
  89. if isinstance(data, dict) and key in data:
  90. data = data[key]
  91. else:
  92. return default
  93. return data