Aestate
ajson.py
Go to the documentation of this file.
1 from datetime import date, datetime
2 
3 import functools
4 
5 from .sim.JSON import Json
6 from .sim import JSONEncoder
7 
8 
9 class CanotfList(list):
10  def __init__(self, value: list):
11  list.__init__([])
12  if isinstance(value, list) and len(value) > 0:
13  for item in value:
14  if isinstance(item, dict):
15  self.append(CanotfDict(item))
16  elif isinstance(item, list) and len(item) > 0:
17  self.append(CanotfList(item))
18  elif isinstance(item, tuple) and len(item) > 0:
19  self.append(CanotfList(list(item)))
20  else:
21  self.append(item)
22 
23 
24 class CanotfDict(dict):
25 
26  def __init__(self, data: dict):
27  super(CanotfDict).__init__()
28  for key, value in data.items():
29  if isinstance(value, dict):
30  setattr(self, key, CanotfDict(value))
31  self[key] = CanotfDict(value)
32  elif isinstance(value, list) and len(value) > 0:
33  setattr(self, key, CanotfList(value))
34  self[key] = CanotfList(value)
35 
36  elif isinstance(value, tuple) and len(value) > 0:
37  setattr(self, key, CanotfList(list(value)))
38  self[key] = CanotfList(list(value))
39 
40  else:
41  setattr(self, key, value)
42  self[key] = value
43 
44 
45 class AJson(Json):
46  """
47  Json工具
48  AJson.parse(**kwargs):将任意对象解析成json字符串
49  AJson.load(**kwargs):将字符串解析成字典
50  """
51 
52  @staticmethod
53  def date_encoder(obj):
54  if isinstance(obj, datetime):
55  return obj.strftime('%Y-%m-%d %H:%M:%S')
56  elif isinstance(obj, date):
57  return obj.strftime('%Y-%m-%d')
58  else:
59  return None
60 
61  class JsonDateEncoder(JSONEncoder):
62  def default(self, obj):
63  return AJson.date_encoder(obj)
64 
65  class SimplejsonDateEncoder(JSONEncoder):
66  def default(self, obj):
67  return AJson.date_encoder(obj)
68 
69  @staticmethod
70  def parse(obj, ignore_name=None, bf=False, end_load=False):
71  """作者:CACode 最后编辑于2021/4/27
72 
73  将对象转换成字典格式:
74  支持:
75  dict
76  list
77  object
78  list[object]
79  object[list]
80  object[list[object]]
81  .......
82 
83  注意事项:
84 
85  bf和end_load同时只能使用一个
86 
87  当两者同时存在时,默认使用end_load功能
88 
89 
90  :param obj:需要解析的对象
91  :param ignore_name: 在对象中放入需要忽略的字段名
92  :param bf:是否需要美化json
93  :param end_load:是否需要在最后转成字典格式
94  """
95 
96  def json_to_str(_obj):
97  """
98  json转字符串
99  """
100  json_f = functools.partial(
101  AJson.dumps, cls=AJson.JsonDateEncoder)
102  json_str = json_f(_obj)
103  return json_str
104 
105  def parse_list(list_obj):
106  """
107  解析list数据的json
108  放置了递归函数,所以不必担心解析报错或者解析不到位
109  """
110  obj_dicts = []
111  for item in list_obj:
112  # 循环集合
113  if isinstance(item, list):
114  # 如果是集合则递归
115  obj_dicts.append(parse_list(item))
116  elif isinstance(item, tuple):
117  # 如果是tuple元组则转成集合后递归
118  return obj_dicts.append(parse_list(list(item)))
119  elif isinstance(item, dict) or isinstance(item, str):
120  # 如果是字典或者字符串,则直接交给obj_dicts填充
121  obj_dicts.append(item)
122  elif isinstance(item, object):
123  # 如果是object则交给parse_obj()解析
124  obj_dicts.append(parse_obj(item))
125  else:
126  obj_dicts.append(item)
127  return obj_dicts
128 
129  def parse_obj(_obj) -> str:
130  """
131  夺命循环递递归
132  """
133  obj_dicts = []
134  if isinstance(_obj, dict):
135  _dict = _obj.__dict__
136  # 如果是list,则交给parse_list(解决)
137  for key, item in _dict.items():
138  obj_dicts.append({
139  key: parse_list(item)
140  })
141  elif isinstance(_obj, list):
142  # 如果是字典或者字符串,则直接交给obj_dicts填充
143  obj_dicts.append(parse_list(_obj))
144  # 由于parse_list()中有对于tuple累心的解析,所以不必担心tuple
145  elif isinstance(_obj, str):
146  # 如果是字典或者字符串,则直接交给obj_dicts填充
147  obj_dicts = _obj
148  else:
149  # 如果不是list类型,则直接解析成字典
150  try:
151  obj_dicts = parse_dict(_obj.__dict__)
152  except AttributeError as e:
153  obj_dicts = _obj
154  # 异常警告,抛出
155  return obj_dicts
156 
157  def parse_dict(_obj):
158  """作者:CACode 最后编辑于2021/4/27
159  解析字典格式
160  """
161  obj_dicts = {}
162  if isinstance(_obj, dict):
163  for key, value in _obj.items():
164  if isinstance(value, list):
165  obj_dicts[key] = parse_list(value)
166  elif isinstance(value, dict):
167  obj_dicts[key] = parse_dict(value)
168  else:
169  v = parse_obj(value)
170  obj_dicts[key] = v
171  return obj_dicts
172 
173  # 如果他是集合并且里面包含的非字典而是object,则将对象转成字典
174  if isinstance(obj, list):
175  obj = parse_list(obj)
176  elif isinstance(obj, dict):
177  obj = parse_dict(obj)
178  elif isinstance(obj, object):
179  obj = parse_obj(obj)
180  # 最后的解析结果
181  result = json_to_str(obj)
182  if end_load:
183  return AJson.load(result)
184  elif bf:
185  return AJson.beautiful(AJson.load(result))
186  return result
187 
188  @staticmethod
189  def load(item):
190  """作者:CACode 最后编辑于2021/4/27
191  将json字符串解析成字典
192  """
193  if isinstance(item, list):
194  _dats = []
195  for i in item:
196  _dats.append(AJson.load(i))
197  return _dats
198  elif isinstance(item, tuple):
199  # 如果是tuple元组则转成集合后递归
200  _dats = []
201  for i in list(item):
202  _dats.append(AJson.load(i))
203  return _dats
204  elif isinstance(item, dict):
205  # 如果是字典,则直接返回
206  return item
207  elif isinstance(item, str):
208  # 如果是字符串则解析为字典
209  return AJson.loads(item)
210  elif isinstance(item, object):
211  # 如果是object则交给parse_obj()解析
212  return item.__dict__
213  else:
214  return AJson.loads(item)
215 
216  @staticmethod
217  def beautiful(_data):
218  """作者:CACode 最后编辑于2021/4/27
219  美化json
220  """
221  return AJson.dumps(_data, sort_keys=True, indent=4, separators=(',', ':'))
222 
223  @staticmethod
224  def json_to_object(json_data):
225  if isinstance(json_data, list):
226  obj = CanotfList(json_data)
227  elif isinstance(json_data, tuple):
228  obj = CanotfList(list(json_data))
229  elif isinstance(json_data, dict):
230  obj = CanotfDict(json_data)
231  else:
232  return None
233 
234  return obj
aestate.ajson.ajson.CanotfDict
Definition: ajson.py:24
aestate.ajson.ajson.AJson.SimplejsonDateEncoder
Definition: ajson.py:65
aestate.ajson.ajson.AJson.JsonDateEncoder.default
def default(self, obj)
Definition: ajson.py:62
aestate.ajson.ajson.AJson
Definition: ajson.py:45
aestate.ajson.ajson.CanotfList
Definition: ajson.py:9
aestate.ajson.ajson.AJson.beautiful
def beautiful(_data)
Definition: ajson.py:217
aestate.ajson.ajson.AJson.date_encoder
def date_encoder(obj)
Definition: ajson.py:53
aestate.ajson.ajson.CanotfDict.__init__
def __init__(self, dict data)
Definition: ajson.py:26
aestate.ajson.ajson.AJson.load
def load(item)
Definition: ajson.py:189
aestate.ajson.ajson.AJson.json_to_object
def json_to_object(json_data)
Definition: ajson.py:224
aestate.ajson.ajson.CanotfList.__init__
def __init__(self, list value)
Definition: ajson.py:10
aestate.ajson.sim.JSON.Json
Definition: JSON.py:12
aestate.ajson.ajson.AJson.parse
def parse(obj, ignore_name=None, bf=False, end_load=False)
Definition: ajson.py:70
aestate.ajson.ajson.AJson.JsonDateEncoder
Definition: ajson.py:61
aestate.ajson.ajson.AJson.SimplejsonDateEncoder.default
def default(self, obj)
Definition: ajson.py:66