6
6
7
7
<<< 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'}]}}
8
8
"""
9
- def loads (Jstr , dupSign_start = "{" , dupSign_end = "}" , _isDebug_ = False ):
9
+ def loads (Jstr , dupSign_start = "{" , dupSign_end = "}" , ordered_dict = False , _isDebug_ = False ):
10
10
import json
11
11
import re
12
12
from collections import OrderedDict
13
13
import traceback
14
14
15
15
def __convert_Jloads_to_Jobj (Jloads , Jobj ):
16
- if type (Jloads ) == OrderedDict :
16
+ if type (Jloads ) in [ dict , OrderedDict ] :
17
17
for k in Jloads .keys ():
18
18
_key = re .split (dupSign_start_escape_regex * 3 + "_\d+_" + dupSign_end_escape_regex * 3 + "$" , k )[0 ]
19
19
20
20
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 ]:
22
22
Jobj [_key ] = Jloads [k ]
23
23
else :
24
24
if type (Jloads [k ]) == list :
25
25
Jobj [_key ] = list ()
26
+ elif type (Jloads [k ]) == dict :
27
+ Jobj [_key ] = dict ()
26
28
else :
27
29
Jobj [_key ] = OrderedDict ()
28
30
29
31
__convert_Jloads_to_Jobj (Jloads [k ], Jobj [_key ])
30
32
else :
31
33
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 ]:
33
35
Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ] = Jloads [k ]
34
36
else :
35
37
if type (Jloads [k ]) == list :
36
38
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 ()
37
41
else :
38
42
Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ] = OrderedDict ()
39
43
40
44
__convert_Jloads_to_Jobj (Jloads [k ], Jobj [_key + dupSign_start * 3 + "_" + str (countObj + 1 )+ "_" + dupSign_end * 3 ])
41
45
elif type (Jloads ) == list :
42
46
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 ]:
44
48
Jobj .append (Jloads [i ])
45
49
else :
46
50
if type (Jloads [i ]) == list :
47
51
Jobj .append (list ())
52
+ elif type (Jloads [i ]) == dict :
53
+ Jobj .append (dict ())
48
54
else :
49
55
Jobj .append (OrderedDict ())
50
56
51
57
__convert_Jloads_to_Jobj (Jloads [i ], Jobj [i ])
52
58
53
59
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 )
55
63
56
- if type (Jloads ) in [list , OrderedDict ] and len (Jloads ) > 0 :
64
+ if type (Jloads ) in [list , dict , OrderedDict ] and len (Jloads ) > 0 :
57
65
try :
58
66
if type (dupSign_start ) not in [str , unicode ] or len (dupSign_start ) == 0 : dupSign_start = "{"
59
67
except Exception as e :
@@ -92,10 +100,14 @@ def __convert_Jloads_to_Jobj(Jloads, Jobj):
92
100
Jstr = re .sub ('\x02 \x03 ' , r'\\"' , Jstr )
93
101
Jstr = re .sub ('\x04 \x05 ' , r'"' , Jstr )
94
102
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 )
96
106
97
107
if type (Jloads ) == list :
98
108
Jobj = list ()
109
+ elif type (Jloads ) == dict :
110
+ Jobj = dict ()
99
111
else :
100
112
Jobj = OrderedDict ()
101
113
@@ -120,7 +132,7 @@ def __convert_Jloads_to_Jobj(Jloads, Jobj):
120
132
# # # # # # # # # # # # # # # # # # # # # # #
121
133
"""
122
134
"""
123
- def load (Jfilepath , dupSign_start = "{" , dupSign_end = "}" , _isDebug_ = False ):
135
+ def load (Jfilepath , dupSign_start = "{" , dupSign_end = "}" , ordered_dict = False , _isDebug_ = False ):
124
136
import traceback
125
137
126
138
try :
@@ -131,7 +143,7 @@ def load(Jfilepath, dupSign_start="{", dupSign_end="}", _isDebug_=False):
131
143
if _isDebug_ : traceback .print_exc ()
132
144
return None
133
145
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_ )
135
147
# # # # # # # # # # # # # # # # # # # # # # #
136
148
# # # # # # # # # # # # # # # # # # # # # # #
137
149
# # # # # # # # # # # # # # # # # # # # # # #
@@ -225,16 +237,20 @@ def dump(Jobj, Jfilepath, dupSign_start="{", dupSign_end="}", _isDebug_=False, s
225
237
226
238
<<< 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'}
227
239
"""
228
- def flatten (Jobj , separator = "||" , parse_index = "$" , _isDebug_ = False ):
240
+ def flatten (Jobj , separator = "||" , parse_index = "$" , ordered_dict = False , _isDebug_ = False ):
229
241
from collections import OrderedDict
230
242
import traceback
231
243
232
- Jflat = OrderedDict ()
244
+ Jflat = dict ()
245
+ if ordered_dict :
246
+ Jflat = OrderedDict ()
233
247
234
248
def __convert_Jobj_to_Jflat (Jobj , key = None ):
235
249
if type (Jobj ) in [dict , OrderedDict ]:
236
250
if len (Jobj ) == 0 :
237
- Jflat [key ] = OrderedDict ()
251
+ Jflat [key ] = dict ()
252
+ if ordered_dict :
253
+ Jflat [key ] = OrderedDict ()
238
254
else :
239
255
for k ,v in Jobj .items ():
240
256
_Jobj = v
@@ -297,24 +313,26 @@ def __convert_Jobj_to_Jflat(Jobj, key=None):
297
313
298
314
<<< 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'}]}}
299
315
"""
300
- def unflatten (Jflat , separator = "||" , parse_index = "$" , _isDebug_ = False ):
316
+ def unflatten (Jflat , separator = "||" , parse_index = "$" , ordered_dict = False , _isDebug_ = False ):
301
317
import re
302
318
from collections import OrderedDict
303
319
import traceback
304
320
305
321
try :
306
322
if type (Jflat ) in [dict , OrderedDict ]:
307
323
if len (Jflat ) == 0 :
308
- return OrderedDict ()
324
+ if ordered_dict :
325
+ return OrderedDict ()
326
+ return dict ()
309
327
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 ()
311
329
312
330
for k , v in Jflat .items ():
313
331
Jtmp = Jobj
314
332
Jkeys = k .split (separator )
315
333
316
334
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 ()
318
336
319
337
if type (Jtmp ) == list :
320
338
Jkey = int (re .compile (re .escape (parse_index )+ "(\d+)" + re .escape (parse_index )).match (Jkey ).group (1 ))
0 commit comments