Skip to content

Commit 7d0e005

Browse files
committed
Released json-duplicate-keys v2024.11.28
1 parent ca1f506 commit 7d0e005

File tree

3 files changed

+38
-22
lines changed

3 files changed

+38
-22
lines changed

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,13 +182,17 @@ print(JDKSObject.getObject())
182182
```
183183
---
184184

185-
### JSON_DUPLICATE_KEYS.update(`name`, `value`, `case_insensitive`=False, `separator`="||", `parse_index`="$", `_isDebug_`=False)
186-
_Update new `value` for existing `name` in the JSON object_
185+
### JSON_DUPLICATE_KEYS.update(`name`, `value`, `case_insensitive`=False, `allow_new_key`=False, `separator`="||", `parse_index`="$", `dupSign_start`="{{{", `dupSign_end`="}}}", `ordered_dict`=False, `_isDebug_`=False)
186+
_Update new `value` for existing `name` or Set a new `name` in the JSON object_
187187
- `name`: the key name of the JSON object. Supported flatten key name format
188188
- `value`: new value for key `name`
189189
- `case_insensitive`: the key name case (in)sensitive
190+
- `allow_new_key`: allows to create a new key name if the key name does not exist
190191
- `separator`:
191192
- `parse_index`:
193+
- `dupSign_start`:
194+
- `dupSign_end`:
195+
- `ordered_dict`: preserves the order in which the Keys are inserted
192196
- `_isDebug_`: Show/ Hide debug error messages
193197
```python
194198
import json_duplicate_keys as jdks
@@ -239,7 +243,7 @@ print(JDKSObject.getObject())
239243
- `name`:
240244
- `separator`:
241245
- `parse_index`:
242-
- `ordered_dict`:
246+
- `ordered_dict`: preserves the order in which the Keys are inserted
243247
```python
244248
import json_duplicate_keys as jdks
245249

@@ -260,7 +264,7 @@ print(JDKSObject.dumps())
260264
- `value`:
261265
- `separator`:
262266
- `parse_index`:
263-
- `ordered_dict`:
267+
- `ordered_dict`: preserves the order in which the Keys are inserted
264268
```python
265269
import json_duplicate_keys as jdks
266270

@@ -378,6 +382,9 @@ print(JDKSObject.getObject())
378382
---
379383

380384
## CHANGELOG
385+
#### [json-duplicate-keys v2024.11.28](https://github.com/truocphan/json-duplicate-keys/tree/2024.11.28)
386+
- **Fixed**: Add subkey name to empty dict of existing key name
387+
381388
#### [json-duplicate-keys v2024.11.19](https://github.com/truocphan/json-duplicate-keys/tree/2024.11.19)
382389
- **Updated**: Allows getting (`JSON_DUPLICATE_KEYS.get`), setting (`JSON_DUPLICATE_KEYS.set`), updating (`JSON_DUPLICATE_KEYS.update`), deleting (`JSON_DUPLICATE_KEYS.delete`) JSON_DUPLICATE_KEYS objects with case-insensitive key names
383390

json_duplicate_keys/__init__.py

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
try:
23
unicode # Python 2
34
except NameError:
@@ -150,9 +151,8 @@ def __convert_Jloads_to_Jobj(Jloads, Jobj):
150151
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
151152
def load(Jfilepath, dupSign_start="{{{", dupSign_end="}}}", ordered_dict=False, _isDebug_=False):
152153
try:
153-
Jfile = open(Jfilepath)
154-
Jstr = Jfile.read()
155-
Jfile.close()
154+
with open(Jfilepath) as Jfile:
155+
Jstr = Jfile.read()
156156

157157
return loads(Jstr, dupSign_start=dupSign_start, dupSign_end=dupSign_end, ordered_dict=ordered_dict, _isDebug_=_isDebug_)
158158
except Exception as e:
@@ -307,16 +307,20 @@ def set(self, name, value, case_insensitive=False, separator="||", parse_index="
307307
else:
308308
if self.get(separator.join(name.split(separator)[:-1]), case_insensitive=case_insensitive, separator=separator, parse_index=parse_index)["value"] != "JSON_DUPLICATE_KEYS_ERROR":
309309
Jget = self.get(separator.join(name.split(separator)[:-1]), case_insensitive=case_insensitive, separator=separator, parse_index=parse_index)
310-
exec_expression = "self.getObject()"
310+
if type(Jget["value"]) in [dict, OrderedDict]:
311+
exec_expression = "self.getObject()"
311312

312-
for k in Jget["name"].split(separator):
313-
if re.search("^"+re.escape(parse_index)+"\\d+"+re.escape(parse_index)+"$", k):
314-
exec_expression += "["+k.split(parse_index)[1]+"]"
315-
else:
316-
exec_expression += "["+repr(k)+"]"
313+
for k in Jget["name"].split(separator)+[name.split(separator)[-1]]:
314+
if re.search("^"+re.escape(parse_index)+"\\d+"+re.escape(parse_index)+"$", k):
315+
exec_expression += "["+k.split(parse_index)[1]+"]"
316+
else:
317+
exec_expression += "["+repr(k)+"]"
317318

318-
exec(exec_expression+"="+repr(value))
319-
return True
319+
exec(exec_expression+"="+repr(value))
320+
return True
321+
else:
322+
if _isDebug_: print("\x1b[31m[-] KeyNameInvalidError: \x1b[0m"+name)
323+
return False
320324
else:
321325
if _isDebug_: print("\x1b[31m[-] KeyNameNotExistError: {}\x1b[0m".format(separator.join(Jget["name"].split(separator)[:-1])))
322326
return False
@@ -328,7 +332,7 @@ def set(self, name, value, case_insensitive=False, separator="||", parse_index="
328332
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
329333
# # # # # # # # # # # # # # update # # # # # # # # # # # # # #
330334
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
331-
def update(self, name, value, case_insensitive=False, separator="||", parse_index="$", _isDebug_=False):
335+
def update(self, name, value, case_insensitive=False, allow_new_key=False, separator="||", parse_index="$", dupSign_start="{{{", dupSign_end="}}}", ordered_dict=False, _isDebug_=False):
332336
import re
333337

334338
# User input data type validation
@@ -344,7 +348,10 @@ def update(self, name, value, case_insensitive=False, separator="||", parse_inde
344348

345349
if type(parse_index) not in [str, unicode]: parse_index = "$"
346350

347-
if self.get(name, case_insensitive=case_insensitive, separator=separator, parse_index=parse_index, _isDebug_=_isDebug_)["value"] != "JSON_DUPLICATE_KEYS_ERROR":
351+
_debug_ = _isDebug_
352+
if allow_new_key: _debug_ = False
353+
354+
if self.get(name, case_insensitive=case_insensitive, separator=separator, parse_index=parse_index, _isDebug_=_debug_)["value"] != "JSON_DUPLICATE_KEYS_ERROR":
348355
Jname = self.get(name, case_insensitive=case_insensitive, separator=separator, parse_index=parse_index)["name"]
349356
try:
350357
exec_expression = "self.getObject()"
@@ -359,6 +366,8 @@ def update(self, name, value, case_insensitive=False, separator="||", parse_inde
359366
return True
360367
except Exception as e:
361368
if _isDebug_: print("\x1b[31m[-] ExceptionError: {}\x1b[0m".format(e))
369+
elif allow_new_key:
370+
return self.set(name, value, case_insensitive=case_insensitive, separator=separator, parse_index=parse_index, dupSign_start=dupSign_start, dupSign_end=dupSign_end, ordered_dict=ordered_dict, _isDebug_=_isDebug_)
362371

363372
return False
364373
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@@ -420,10 +429,10 @@ def filter_keys(self, name, separator="||", parse_index="$", ordered_dict=False)
420429
for k, v in JDKSObject.getObject().items():
421430
if type(k) == str and type(name) == str:
422431
if re.search(name, k):
423-
newJDKSObject.set(k, v, separator="!!"+separator+"!!", parse_index="!!"+parse_index+"!!", ordered_dict=ordered_dict)
432+
newJDKSObject.set(k, v, separator="§§"+separator+"§§", parse_index="§§"+parse_index+"§§", ordered_dict=ordered_dict)
424433
else:
425434
if name == k:
426-
newJDKSObject.set(k, v, separator="!!"+separator+"!!", parse_index="!!"+parse_index+"!!", ordered_dict=ordered_dict)
435+
newJDKSObject.set(k, v, separator="§§"+separator+"§§", parse_index="§§"+parse_index+"§§", ordered_dict=ordered_dict)
427436

428437
return newJDKSObject
429438
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
@@ -444,10 +453,10 @@ def filter_values(self, value, separator="||", parse_index="$", ordered_dict=Fal
444453
for k, v in JDKSObject.getObject().items():
445454
if type(v) == str and type(value) == str:
446455
if re.search(value, v):
447-
newJDKSObject.set(k, v, separator="!!"+separator+"!!", parse_index="!!"+parse_index+"!!", ordered_dict=ordered_dict)
456+
newJDKSObject.set(k, v, separator="§§"+separator+"§§", parse_index="§§"+parse_index+"§§", ordered_dict=ordered_dict)
448457
else:
449458
if value == v:
450-
newJDKSObject.set(k, v, separator="!!"+separator+"!!", parse_index="!!"+parse_index+"!!", ordered_dict=ordered_dict)
459+
newJDKSObject.set(k, v, separator="§§"+separator+"§§", parse_index="§§"+parse_index+"§§", ordered_dict=ordered_dict)
451460

452461
return newJDKSObject
453462
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
setuptools.setup(
44
name="json-duplicate-keys",
5-
version="2024.11.19",
5+
version="2024.11.28",
66
author="TP Cyber Security",
77
license="MIT",
88
author_email="[email protected]",

0 commit comments

Comments
 (0)