Skip to content

Commit ca5c697

Browse files
authored
Update __init__.py
1 parent d3f509f commit ca5c697

File tree

1 file changed

+35
-17
lines changed

1 file changed

+35
-17
lines changed

json_duplicate_keys/__init__.py

+35-17
Original file line numberDiff line numberDiff line change
@@ -6,54 +6,62 @@
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

Comments
 (0)