66
77<<< OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': '22.3.3', 'version{{{_2_}}}': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}
88"""
9- def loads (Jstr , dupSign_start = "{" , dupSign_end = "}" , _isDebug_ = False ):
9+ def loads (Jstr , dupSign_start = "{" , dupSign_end = "}" , ordered_dict = False , _isDebug_ = False ):
1010 import json
1111 import re
1212 from collections import OrderedDict
1313 import traceback
1414
1515 def __convert_Jloads_to_Jobj (Jloads , Jobj ):
16- if type (Jloads ) == OrderedDict :
16+ if type (Jloads ) in [ dict , OrderedDict ] :
1717 for k in Jloads .keys ():
1818 _key = re .split (dupSign_start_escape_regex * 3 + "_\d+_" + dupSign_end_escape_regex * 3 + "$" , k )[0 ]
1919
2020 if _key not in Jobj .keys ():
21- if type (Jloads [k ]) not in [list , OrderedDict ]:
21+ if type (Jloads [k ]) not in [list , dict , OrderedDict ]:
2222 Jobj [_key ] = Jloads [k ]
2323 else :
2424 if type (Jloads [k ]) == list :
2525 Jobj [_key ] = list ()
26+ elif type (Jloads [k ]) == dict :
27+ Jobj [_key ] = dict ()
2628 else :
2729 Jobj [_key ] = OrderedDict ()
2830
2931 __convert_Jloads_to_Jobj (Jloads [k ], Jobj [_key ])
3032 else :
3133 countObj = len ([i for i in Jobj .keys () if _key == re .split (dupSign_start_escape_regex * 3 + "_\d+_" + dupSign_end_escape_regex * 3 + "$" , i )[0 ]])
32- if type (Jloads [k ]) not in [list , OrderedDict ]:
34+ if type (Jloads [k ]) not in [list , dict , OrderedDict ]:
3335 Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ] = Jloads [k ]
3436 else :
3537 if type (Jloads [k ]) == list :
3638 Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ] = list ()
39+ elif type (Jloads [k ]) == dict :
40+ Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ] = dict ()
3741 else :
3842 Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ] = OrderedDict ()
3943
4044 __convert_Jloads_to_Jobj (Jloads [k ], Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ])
4145 elif type (Jloads ) == list :
4246 for i in range (len (Jloads )):
43- if type (Jloads [i ]) not in [list , OrderedDict ]:
47+ if type (Jloads [i ]) not in [list , dict , OrderedDict ]:
4448 Jobj .append (Jloads [i ])
4549 else :
4650 if type (Jloads [i ]) == list :
4751 Jobj .append (list ())
52+ elif type (Jloads [i ]) == dict :
53+ Jobj .append (dict ())
4854 else :
4955 Jobj .append (OrderedDict ())
5056
5157 __convert_Jloads_to_Jobj (Jloads [i ], Jobj [i ])
5258
5359 try :
54- Jloads = json .loads (Jstr , object_pairs_hook = OrderedDict )
60+ Jloads = json .loads (Jstr )
61+ if ordered_dict :
62+ Jloads = json .loads (Jstr , object_pairs_hook = OrderedDict )
5563
56- if type (Jloads ) in [list , OrderedDict ] and len (Jloads ) > 0 :
64+ if type (Jloads ) in [list , dict , OrderedDict ] and len (Jloads ) > 0 :
5765 try :
5866 if type (dupSign_start ) not in [str , unicode ] or len (dupSign_start ) == 0 : dupSign_start = "{"
5967 except Exception as e :
@@ -92,10 +100,14 @@ def __convert_Jloads_to_Jobj(Jloads, Jobj):
92100 Jstr = re .sub ('\x02 \x03 ' , r'\\"' , Jstr )
93101 Jstr = re .sub ('\x04 \x05 ' , r'"' , Jstr )
94102
95- Jloads = json .loads (Jstr , object_pairs_hook = OrderedDict )
103+ Jloads = json .loads (Jstr )
104+ if ordered_dict :
105+ Jloads = json .loads (Jstr , object_pairs_hook = OrderedDict )
96106
97107 if type (Jloads ) == list :
98108 Jobj = list ()
109+ elif type (Jloads ) == dict :
110+ Jobj = dict ()
99111 else :
100112 Jobj = OrderedDict ()
101113
@@ -120,7 +132,7 @@ def __convert_Jloads_to_Jobj(Jloads, Jobj):
120132# # # # # # # # # # # # # # # # # # # # # # #
121133"""
122134"""
123- def load (Jfilepath , dupSign_start = "{" , dupSign_end = "}" , _isDebug_ = False ):
135+ def load (Jfilepath , dupSign_start = "{" , dupSign_end = "}" , ordered_dict = False , _isDebug_ = False ):
124136 import traceback
125137
126138 try :
@@ -131,7 +143,7 @@ def load(Jfilepath, dupSign_start="{", dupSign_end="}", _isDebug_=False):
131143 if _isDebug_ : traceback .print_exc ()
132144 return None
133145
134- return loads (Jstr , dupSign_start = dupSign_start , dupSign_end = dupSign_end , _isDebug_ = _isDebug_ )
146+ return loads (Jstr , dupSign_start = dupSign_start , dupSign_end = dupSign_end , ordered_dict = ordered_dict , _isDebug_ = _isDebug_ )
135147# # # # # # # # # # # # # # # # # # # # # # #
136148# # # # # # # # # # # # # # # # # # # # # # #
137149# # # # # # # # # # # # # # # # # # # # # # #
@@ -225,16 +237,20 @@ def dump(Jobj, Jfilepath, dupSign_start="{", dupSign_end="}", _isDebug_=False, s
225237
226238<<< OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': '22.3.14', 'release||$0$||version': '22.3.3', 'release||$0$||version{{{_2_}}}': 'latest', 'snapshot||author': 'truocphan', 'snapshot||version': '22.3.3', 'snapshot||release||$0$||version': 'latest'}
227239"""
228- def flatten (Jobj , separator = "||" , parse_index = "$" , _isDebug_ = False ):
240+ def flatten (Jobj , separator = "||" , parse_index = "$" , ordered_dict = False , _isDebug_ = False ):
229241 from collections import OrderedDict
230242 import traceback
231243
232- Jflat = OrderedDict ()
244+ Jflat = dict ()
245+ if ordered_dict :
246+ Jflat = OrderedDict ()
233247
234248 def __convert_Jobj_to_Jflat (Jobj , key = None ):
235249 if type (Jobj ) in [dict , OrderedDict ]:
236250 if len (Jobj ) == 0 :
237- Jflat [key ] = OrderedDict ()
251+ Jflat [key ] = dict ()
252+ if ordered_dict :
253+ Jflat [key ] = OrderedDict ()
238254 else :
239255 for k ,v in Jobj .items ():
240256 _Jobj = v
@@ -297,24 +313,26 @@ def __convert_Jobj_to_Jflat(Jobj, key=None):
297313
298314<<< OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': '22.3.14', 'release': [{'version': '22.3.3', 'version{{{_2_}}}': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': '22.3.14'}]}}
299315"""
300- def unflatten (Jflat , separator = "||" , parse_index = "$" , _isDebug_ = False ):
316+ def unflatten (Jflat , separator = "||" , parse_index = "$" , ordered_dict = False , _isDebug_ = False ):
301317 import re
302318 from collections import OrderedDict
303319 import traceback
304320
305321 try :
306322 if type (Jflat ) in [dict , OrderedDict ]:
307323 if len (Jflat ) == 0 :
308- return OrderedDict ()
324+ if ordered_dict :
325+ return OrderedDict ()
326+ return dict ()
309327 else :
310- Jobj = list () if len ([k for k in Jflat .keys () if re .compile ("^" + re .escape (parse_index )+ "\d+" + re .escape (parse_index )+ "$" ).match (str (k ).split (separator )[0 ])]) == len (Jflat .keys ()) else OrderedDict ()
328+ Jobj = list () if len ([k for k in Jflat .keys () if re .compile ("^" + re .escape (parse_index )+ "\d+" + re .escape (parse_index )+ "$" ).match (str (k ).split (separator )[0 ])]) == len (Jflat .keys ()) else OrderedDict () if ordered_dict else dict ()
311329
312330 for k , v in Jflat .items ():
313331 Jtmp = Jobj
314332 Jkeys = k .split (separator )
315333
316334 for count , (Jkey , next_Jkeys ) in enumerate (zip (Jkeys , Jkeys [1 :] + [v ]), 1 ):
317- v = next_Jkeys if count == len (Jkeys ) else list () if re .compile ("^" + re .escape (parse_index )+ "\d+" + re .escape (parse_index )+ "$" ).match (next_Jkeys ) else OrderedDict ()
335+ v = next_Jkeys if count == len (Jkeys ) else list () if re .compile ("^" + re .escape (parse_index )+ "\d+" + re .escape (parse_index )+ "$" ).match (next_Jkeys ) else OrderedDict () if ordered_dict else dict ()
318336
319337 if type (Jtmp ) == list :
320338 Jkey = int (re .compile (re .escape (parse_index )+ "(\d+)" + re .escape (parse_index )).match (Jkey ).group (1 ))
0 commit comments