json-duplicate-keys


Namejson-duplicate-keys JSON
Version 2025.9.9 PyPI version JSON
download
home_pageNone
SummaryFlatten/ Unflatten and Load(s)/ Dump(s) JSON File/ Object with Duplicate Keys
upload_time2025-09-09 04:07:49
maintainerNone
docs_urlNone
authorNone
requires_pythonNone
licenseMIT
keywords tpcybersec json duplicate keys json duplicate keys flatten unflatten
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">
	<h1>JSON Duplicate Keys - PyPI</h1>
	<i>Flatten/ Unflatten and Load(s)/ Dump(s) JSON File/ Object with Duplicate Keys</i>
	<br><br>
	<a href="https://github.com/TPCyberSec/json-duplicate-keys/releases/"><img src="https://img.shields.io/github/release/TPCyberSec/json-duplicate-keys" height=30></a>
	<a href="#"><img src="https://img.shields.io/github/downloads/TPCyberSec/json-duplicate-keys/total" height=30></a>
	<a href="#"><img src="https://img.shields.io/github/stars/TPCyberSec/json-duplicate-keys" height=30></a>
	<a href="#"><img src="https://img.shields.io/github/forks/TPCyberSec/json-duplicate-keys" height=30></a>
	<a href="https://github.com/TPCyberSec/json-duplicate-keys/issues?q=is%3Aopen+is%3Aissue"><img src="https://img.shields.io/github/issues/TPCyberSec/json-duplicate-keys" height=30></a>
	<a href="https://github.com/TPCyberSec/json-duplicate-keys/issues?q=is%3Aissue+is%3Aclosed"><img src="https://img.shields.io/github/issues-closed/TPCyberSec/json-duplicate-keys" height=30></a>
	<br>
	<a href="#"><img src="https://img.shields.io/pypi/v/json-duplicate-keys" height=30></a>
	<a href="#"><img src="https://img.shields.io/pypi/pyversions/json-duplicate-keys" height=30></a>
	<a href="#"><img src="https://img.shields.io/pypi/dm/json-duplicate-keys" height=30></a>
</div>

---
# 🛠️ Installation
#### From PyPI:
```console
pip install json-duplicate-keys
```
#### From Source:
```console
git clone https://github.com/TPCyberSec/json-duplicate-keys.git --branch <Branch/Tag>
cd json-duplicate-keys
python -m build
python -m pip install dist/json_duplicate_keys-<version>-py3-none-any.whl
```

---
# 📘 Basic Usage
### normalize_key(`name`, `dupSign_start`="{{{", `dupSign_end`="}}}", `_isDebug_`=False)
_Normalize Key name_
- `name`: key name
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

print(jdks.normalize_key("version{{{_2_}}}"))
# OUTPUT: version
```

---
### loads(`Jstr`, `dupSign_start`="{{{", `dupSign_end`="}}}", `ordered_dict`=False, `skipDuplicated`=False, `_isDebug_`=False)
_Deserialize a JSON format string to a class `JSON_DUPLICATE_KEYS`_
- `Jstr`: a JSON format string
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `ordered_dict`: preserves the order in which the Keys are inserted
- `skipDuplicated`: Skip loading duplicate keys to improve execution performance
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject)
# OUTPUT: <json_duplicate_keys.JSON_DUPLICATE_KEYS object at 0x00000270AE987940>
```

---
### load(`Jfilepath`, `dupSign_start`="{{{", `dupSign_end`="}}}", `ordered_dict`=False, `skipDuplicated`=False, `_isDebug_`=False)
_Deserialize a JSON format string from a file to a class `JSON_DUPLICATE_KEYS`_
- `Jfilepath`: The path to the file containing the JSON format string
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `ordered_dict`: preserves the order in which the Keys are inserted
- `skipDuplicated`: Skip loading duplicate keys to improve execution performance
- `_isDebug_`: Show/ Hide debug error messages
```python
# /path/to/file.json: {"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}

import json_duplicate_keys as jdks

Jfilepath = "/path/to/file.json"

JDKSObject = jdks.load(Jfilepath)

print(JDKSObject)
# OUTPUT: <json_duplicate_keys.JSON_DUPLICATE_KEYS object at 0x00000270AE986D40>
```

---
### JSON_DUPLICATE_KEYS.getObject()
_Get the JSON object_
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}
```

---
### JSON_DUPLICATE_KEYS.get(`name`, `case_insensitive`=False, `separator`="||", `parse_index`="$", `_isDebug_`=False)
_Get value in the JSON object by `name`_
- `name`: the key name of the JSON object. Supported flatten key name format
- `case_insensitive`: the key name case (in)sensitive
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.get("version{{{_2_}}}"))
# OUTPUT: {'name': 'version{{{_2_}}}', 'value': 'latest'}

print(JDKSObject.get("release||$0$"))
# OUTPUT: {'name': 'release||$0$', 'value': {'version': 'latest'}}

print(JDKSObject.get("snapshot||author"))
# OUTPUT: {'name': 'snapshot||author', 'value': 'truocphan'}
```

---
### JSON_DUPLICATE_KEYS.set(`name`, `value`, `case_insensitive`=False, `separator`="||", `parse_index`="$", `dupSign_start`="{{{", `dupSign_end`="}}}", `ordered_dict`=False, `_isDebug_`=False)
_Set a new `name` and `value` for the JSON object_
- `name`: new key name for the JSON object. Supported flat key name format
- `value`: value for key `name`
- `case_insensitive`: the key name case (in)sensitive
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `ordered_dict`: preserves the order in which the Keys are inserted
- `_isDebug_`: Show/Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{}'
JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {}

JDKSObject.set("author", "truocphan")
print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan'}

JDKSObject.set("version", "22.3.3")
print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3'}

JDKSObject.set("version", "latest")
print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest'}

JDKSObject.set("release", [{"version": "latest"}])
print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}]}

JDKSObject.set("snapshot", {})
print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {}}

JDKSObject.set("snapshot||author", "truocphan")
print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan'}}
```

---
### JSON_DUPLICATE_KEYS.insert(`name`, `value`, `position`=None, `case_insensitive`=False, `separator`="||", `parse_index`="$", `dupSign_start`="{{{", `dupSign_end`="}}}", `_isDebug_`=False)
_Insert `value` at `position` in value list of `name`_
- `name`: the key name of the JSON object. Supported flatten key name format
- `value`: new value for key `name`
- `position`: position of the `value` to insert (default insert at the last position of the list)
- `case_insensitive`: the key name case (in)sensitive
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}

JDKSObject.insert("release", {'version': '2025.1.1'})
JDKSObject.insert("snapshot||release", {'version': '2025.1.1'}, 0)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}, {'version': '2025.1.1'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': '2025.1.1'}, {'version': 'latest'}]}}


JDKSObject = jdks.loads("[]")

JDKSObject.insert(None, {"release": []})
JDKSObject.insert(None, {"author": "truocphan"}, 0)
JDKSObject.insert("$1$||release", {"version": "2025.9.9"})

print(JDKSObject.getObject())
# OUTPUT: [{'author': 'truocphan'}, {'release': [{'version': '2025.9.9'}]}]
```

---
### 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)
_Update new `value` for existing `name` or Set a new `name` in the JSON object_
- `name`: the key name of the JSON object. Supported flatten key name format
- `value`: new value for key `name`
- `case_insensitive`: the key name case (in)sensitive
- `allow_new_key`: allows to create a new key name if the key name does not exist
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `ordered_dict`: preserves the order in which the Keys are inserted
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}

JDKSObject.update("version{{{_2_}}}", ["22.3.3", "latest"])
JDKSObject.update("snapshot||version", "latest")

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': ['22.3.3', 'latest'], 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': 'latest', 'release': [{'version': 'latest'}]}}
```

---
### JSON_DUPLICATE_KEYS.delete(`name`, `case_insensitive`=False, `separator`="||", `parse_index`="$", `_isDebug_`=False)
_Delete a key-value pair in a JSON object by key `name`_
- `name`: the key name of the JSON object. Supported flatten key name format
- `case_insensitive`: the key name case (in)sensitive
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}

JDKSObject.delete("version")
JDKSObject.delete("release||$0$")
JDKSObject.delete("snapshot")

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version{{{_2_}}}': 'latest', 'release': []}
```

---
### JSON_DUPLICATE_KEYS.filter_keys(`name`, `separator`="||", `parse_index`="$", `ordered_dict`=False)
_Return a `JSON_DUPLICATE_KEYS` object with keys matching a pattern_
- `name`:
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `ordered_dict`: preserves the order in which the Keys are inserted
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.filter_keys("version").dumps())
# OUTPUT: {"version": "22.3.3", "version": "latest", "release||$0$||version": "latest", "snapshot||version": "22.3.3", "snapshot||release||$0$||version": "latest"}

print(JDKSObject.dumps())
# OUTPUT: {"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}
```

---
### JSON_DUPLICATE_KEYS.filter_values(`value`, `separator`="||", `parse_index`="$", `ordered_dict`=False)
_Return a `JSON_DUPLICATE_KEYS` object with values matching a pattern_
- `value`:
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `ordered_dict`: preserves the order in which the Keys are inserted
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.filter_values("latest").dumps())
# OUTPUT: {"version": "latest", "release||$0$||version": "latest", "snapshot||release||$0$||version": "latest"}

print(JDKSObject.dumps())
# OUTPUT: {"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}
```

---
### JSON_DUPLICATE_KEYS.dumps(`dupSign_start`="{{{", `dupSign_end`="}}}", `_isDebug_`=False, `skipkeys`=False, `ensure_ascii`=True, `check_circular`=True, `allow_nan`=True, `cls`=None, `indent`=None, `separators`=None, `default`=None, `sort_keys`=False)
_Serialize a JSON object to a JSON format string_
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `_isDebug_`: Show/ Hide debug error messages
- For remaining arguments, please refer to [json.dump()](https://docs.python.org/3/library/json.html#json.dump)
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}

JDKSObject.delete("version")
JDKSObject.delete("release||$0$")
JDKSObject.delete("snapshot")

print(JDKSObject.dumps())
# OUTPUT: {"author": "truocphan", "version": "latest", "release": []}
```

---
### JSON_DUPLICATE_KEYS.dump(`Jfilepath`, `dupSign_start`="{{{", `dupSign_end`="}}}", `_isDebug_`=False, `skipkeys`=False, `ensure_ascii`=True, `check_circular`=True, `allow_nan`=True, `cls`=None, `indent`=None, `separators`=None, `default`=None, `sort_keys`=False)
_Serialize a JSON object to a JSON format string and write to a file_
- `Jfilepath`: the path to the file to save the JSON format string
- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)
- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)
- `_isDebug_`: Show/ Hide debug error messages
- For remaining arguments, please refer to [json.dump()](https://docs.python.org/3/library/json.html#json.dump)
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}

JDKSObject.delete("version")
JDKSObject.delete("release||$0$")
JDKSObject.delete("snapshot")

Jfilepath = "/path/to/file.json"
JDKSObject.dump(Jfilepath)

JDKSObject_load = jdks.load(Jfilepath)
print(JDKSObject_load.getObject())
# OUTPUT: {'author': 'truocphan', 'version': 'latest', 'release': []}
```

---
### JSON_DUPLICATE_KEYS.flatten(`separator`="||", `parse_index`="$", `ordered_dict`=False, `_isDebug_`=False)
_Flatten a JSON object to a single key-value pairs_
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `ordered_dict`: preserves the order in which the Keys are inserted
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release": [{"version": "latest"}], "snapshot": {"author": "truocphan", "version": "22.3.3", "release": [{"version": "latest"}]}}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}

JDKSObject.flatten()

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release||$0$||version': 'latest', 'snapshot||author': 'truocphan', 'snapshot||version': '22.3.3', 'snapshot||release||$0$||version': 'latest'}
```

---
### JSON_DUPLICATE_KEYS.unflatten(`separator`="||", `parse_index`="$", `ordered_dict`=False, `_isDebug_`=False)
_Unflatten a flattened JSON object back to a JSON object_
- `separator`: Separator for flatten keys (default: `||`)
- `parse_index`: Symbol for index parsing (default: `$`)
- `ordered_dict`: preserves the order in which the Keys are inserted
- `_isDebug_`: Show/ Hide debug error messages
```python
import json_duplicate_keys as jdks

Jstr = '{"author": "truocphan", "version": "22.3.3", "version": "latest", "release||$0$||version": "latest", "snapshot||author": "truocphan", "snapshot||version": "22.3.3", "snapshot||release||$0$||version": "latest"}'

JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release||$0$||version': 'latest', 'snapshot||author': 'truocphan', 'snapshot||version': '22.3.3', 'snapshot||release||$0$||version': 'latest'}

JDKSObject.unflatten()

print(JDKSObject.getObject())
# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}
```

---
# 📝 CHANGELOG
### [json-duplicate-keys v2025.9.9](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.9.9)
- **Fixed**: Inserting a value with an `empty` or `null` name

### [json-duplicate-keys v2025.8.19](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.8.19)
- **Updated**: Add an exception when loading a non-existent file
- **Updated**: Dump Unicode characters to a file

### [json-duplicate-keys v2025.7.1](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.7.1)
- **Updated**: Fixed some issues when loading JSON strings with `skipDuplicated` option
- **Updated**: Allow loading of JSON data in byte string format
- **Updated**: Issue with getting and setting an empty list

### [json-duplicate-keys v2025.6.6](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.6.6)
- **Updated** Added `skipDuplicated` parameter to `load` and `loads` functions to improve performance when parsing large JSON strings by skipping duplicate keys.

### [json-duplicate-keys v2024.12.12](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.12.12)
- **New**: _insert_ function

### [json-duplicate-keys v2024.11.28](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.11.28)
- **Fixed**: Add subkey name to empty dict of existing key name

### [json-duplicate-keys v2024.11.19](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.11.19)
- **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

### [json-duplicate-keys v2024.7.17](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.7.17)
- **Fixed**: issue #3 break the set function when the key's value is empty. Thanks [ptth222](https://github.com/ptth222) for reporting this issue.

### [json-duplicate-keys v2024.4.20](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.4.20)
- **New**: _filter_values_
- **Updated**: _filter_keys_

### [json-duplicate-keys v2024.3.24](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.3.24)
- **Updated**: _normalize_key_, _loads_, _get_, _set_, _update_, _delete_

---

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "json-duplicate-keys",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": "TPCyberSec, json, duplicate keys, json duplicate keys, flatten, unflatten",
    "author": null,
    "author_email": "TP Cyber Security <tpcybersec2023@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/db/65/511dc47f90c0d063e307ef2af86ac4fb82b8133bb0934e4644dc185acafd/json_duplicate_keys-2025.9.9.tar.gz",
    "platform": null,
    "description": "<div align=\"center\">\r\n\t<h1>JSON Duplicate Keys - PyPI</h1>\r\n\t<i>Flatten/ Unflatten and Load(s)/ Dump(s) JSON File/ Object with Duplicate Keys</i>\r\n\t<br><br>\r\n\t<a href=\"https://github.com/TPCyberSec/json-duplicate-keys/releases/\"><img src=\"https://img.shields.io/github/release/TPCyberSec/json-duplicate-keys\" height=30></a>\r\n\t<a href=\"#\"><img src=\"https://img.shields.io/github/downloads/TPCyberSec/json-duplicate-keys/total\" height=30></a>\r\n\t<a href=\"#\"><img src=\"https://img.shields.io/github/stars/TPCyberSec/json-duplicate-keys\" height=30></a>\r\n\t<a href=\"#\"><img src=\"https://img.shields.io/github/forks/TPCyberSec/json-duplicate-keys\" height=30></a>\r\n\t<a href=\"https://github.com/TPCyberSec/json-duplicate-keys/issues?q=is%3Aopen+is%3Aissue\"><img src=\"https://img.shields.io/github/issues/TPCyberSec/json-duplicate-keys\" height=30></a>\r\n\t<a href=\"https://github.com/TPCyberSec/json-duplicate-keys/issues?q=is%3Aissue+is%3Aclosed\"><img src=\"https://img.shields.io/github/issues-closed/TPCyberSec/json-duplicate-keys\" height=30></a>\r\n\t<br>\r\n\t<a href=\"#\"><img src=\"https://img.shields.io/pypi/v/json-duplicate-keys\" height=30></a>\r\n\t<a href=\"#\"><img src=\"https://img.shields.io/pypi/pyversions/json-duplicate-keys\" height=30></a>\r\n\t<a href=\"#\"><img src=\"https://img.shields.io/pypi/dm/json-duplicate-keys\" height=30></a>\r\n</div>\r\n\r\n---\r\n# \ud83d\udee0\ufe0f Installation\r\n#### From PyPI:\r\n```console\r\npip install json-duplicate-keys\r\n```\r\n#### From Source:\r\n```console\r\ngit clone https://github.com/TPCyberSec/json-duplicate-keys.git --branch <Branch/Tag>\r\ncd json-duplicate-keys\r\npython -m build\r\npython -m pip install dist/json_duplicate_keys-<version>-py3-none-any.whl\r\n```\r\n\r\n---\r\n# \ud83d\udcd8 Basic Usage\r\n### normalize_key(`name`, `dupSign_start`=\"{{{\", `dupSign_end`=\"}}}\", `_isDebug_`=False)\r\n_Normalize Key name_\r\n- `name`: key name\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nprint(jdks.normalize_key(\"version{{{_2_}}}\"))\r\n# OUTPUT: version\r\n```\r\n\r\n---\r\n### loads(`Jstr`, `dupSign_start`=\"{{{\", `dupSign_end`=\"}}}\", `ordered_dict`=False, `skipDuplicated`=False, `_isDebug_`=False)\r\n_Deserialize a JSON format string to a class `JSON_DUPLICATE_KEYS`_\r\n- `Jstr`: a JSON format string\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n- `skipDuplicated`: Skip loading duplicate keys to improve execution performance\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject)\r\n# OUTPUT: <json_duplicate_keys.JSON_DUPLICATE_KEYS object at 0x00000270AE987940>\r\n```\r\n\r\n---\r\n### load(`Jfilepath`, `dupSign_start`=\"{{{\", `dupSign_end`=\"}}}\", `ordered_dict`=False, `skipDuplicated`=False, `_isDebug_`=False)\r\n_Deserialize a JSON format string from a file to a class `JSON_DUPLICATE_KEYS`_\r\n- `Jfilepath`: The path to the file containing the JSON format string\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n- `skipDuplicated`: Skip loading duplicate keys to improve execution performance\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\n# /path/to/file.json: {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}\r\n\r\nimport json_duplicate_keys as jdks\r\n\r\nJfilepath = \"/path/to/file.json\"\r\n\r\nJDKSObject = jdks.load(Jfilepath)\r\n\r\nprint(JDKSObject)\r\n# OUTPUT: <json_duplicate_keys.JSON_DUPLICATE_KEYS object at 0x00000270AE986D40>\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.getObject()\r\n_Get the JSON object_\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.get(`name`, `case_insensitive`=False, `separator`=\"||\", `parse_index`=\"$\", `_isDebug_`=False)\r\n_Get value in the JSON object by `name`_\r\n- `name`: the key name of the JSON object. Supported flatten key name format\r\n- `case_insensitive`: the key name case (in)sensitive\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.get(\"version{{{_2_}}}\"))\r\n# OUTPUT: {'name': 'version{{{_2_}}}', 'value': 'latest'}\r\n\r\nprint(JDKSObject.get(\"release||$0$\"))\r\n# OUTPUT: {'name': 'release||$0$', 'value': {'version': 'latest'}}\r\n\r\nprint(JDKSObject.get(\"snapshot||author\"))\r\n# OUTPUT: {'name': 'snapshot||author', 'value': 'truocphan'}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.set(`name`, `value`, `case_insensitive`=False, `separator`=\"||\", `parse_index`=\"$\", `dupSign_start`=\"{{{\", `dupSign_end`=\"}}}\", `ordered_dict`=False, `_isDebug_`=False)\r\n_Set a new `name` and `value` for the JSON object_\r\n- `name`: new key name for the JSON object. Supported flat key name format\r\n- `value`: value for key `name`\r\n- `case_insensitive`: the key name case (in)sensitive\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n- `_isDebug_`: Show/Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{}'\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {}\r\n\r\nJDKSObject.set(\"author\", \"truocphan\")\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan'}\r\n\r\nJDKSObject.set(\"version\", \"22.3.3\")\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3'}\r\n\r\nJDKSObject.set(\"version\", \"latest\")\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest'}\r\n\r\nJDKSObject.set(\"release\", [{\"version\": \"latest\"}])\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}]}\r\n\r\nJDKSObject.set(\"snapshot\", {})\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {}}\r\n\r\nJDKSObject.set(\"snapshot||author\", \"truocphan\")\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan'}}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.insert(`name`, `value`, `position`=None, `case_insensitive`=False, `separator`=\"||\", `parse_index`=\"$\", `dupSign_start`=\"{{{\", `dupSign_end`=\"}}}\", `_isDebug_`=False)\r\n_Insert `value` at `position` in value list of `name`_\r\n- `name`: the key name of the JSON object. Supported flatten key name format\r\n- `value`: new value for key `name`\r\n- `position`: position of the `value` to insert (default insert at the last position of the list)\r\n- `case_insensitive`: the key name case (in)sensitive\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n\r\nJDKSObject.insert(\"release\", {'version': '2025.1.1'})\r\nJDKSObject.insert(\"snapshot||release\", {'version': '2025.1.1'}, 0)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}, {'version': '2025.1.1'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': '2025.1.1'}, {'version': 'latest'}]}}\r\n\r\n\r\nJDKSObject = jdks.loads(\"[]\")\r\n\r\nJDKSObject.insert(None, {\"release\": []})\r\nJDKSObject.insert(None, {\"author\": \"truocphan\"}, 0)\r\nJDKSObject.insert(\"$1$||release\", {\"version\": \"2025.9.9\"})\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: [{'author': 'truocphan'}, {'release': [{'version': '2025.9.9'}]}]\r\n```\r\n\r\n---\r\n### 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)\r\n_Update new `value` for existing `name` or Set a new `name` in the JSON object_\r\n- `name`: the key name of the JSON object. Supported flatten key name format\r\n- `value`: new value for key `name`\r\n- `case_insensitive`: the key name case (in)sensitive\r\n- `allow_new_key`: allows to create a new key name if the key name does not exist\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n\r\nJDKSObject.update(\"version{{{_2_}}}\", [\"22.3.3\", \"latest\"])\r\nJDKSObject.update(\"snapshot||version\", \"latest\")\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': ['22.3.3', 'latest'], 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': 'latest', 'release': [{'version': 'latest'}]}}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.delete(`name`, `case_insensitive`=False, `separator`=\"||\", `parse_index`=\"$\", `_isDebug_`=False)\r\n_Delete a key-value pair in a JSON object by key `name`_\r\n- `name`: the key name of the JSON object. Supported flatten key name format\r\n- `case_insensitive`: the key name case (in)sensitive\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n\r\nJDKSObject.delete(\"version\")\r\nJDKSObject.delete(\"release||$0$\")\r\nJDKSObject.delete(\"snapshot\")\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version{{{_2_}}}': 'latest', 'release': []}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.filter_keys(`name`, `separator`=\"||\", `parse_index`=\"$\", `ordered_dict`=False)\r\n_Return a `JSON_DUPLICATE_KEYS` object with keys matching a pattern_\r\n- `name`:\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.filter_keys(\"version\").dumps())\r\n# OUTPUT: {\"version\": \"22.3.3\", \"version\": \"latest\", \"release||$0$||version\": \"latest\", \"snapshot||version\": \"22.3.3\", \"snapshot||release||$0$||version\": \"latest\"}\r\n\r\nprint(JDKSObject.dumps())\r\n# OUTPUT: {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.filter_values(`value`, `separator`=\"||\", `parse_index`=\"$\", `ordered_dict`=False)\r\n_Return a `JSON_DUPLICATE_KEYS` object with values matching a pattern_\r\n- `value`:\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.filter_values(\"latest\").dumps())\r\n# OUTPUT: {\"version\": \"latest\", \"release||$0$||version\": \"latest\", \"snapshot||release||$0$||version\": \"latest\"}\r\n\r\nprint(JDKSObject.dumps())\r\n# OUTPUT: {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.dumps(`dupSign_start`=\"{{{\", `dupSign_end`=\"}}}\", `_isDebug_`=False, `skipkeys`=False, `ensure_ascii`=True, `check_circular`=True, `allow_nan`=True, `cls`=None, `indent`=None, `separators`=None, `default`=None, `sort_keys`=False)\r\n_Serialize a JSON object to a JSON format string_\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n- For remaining arguments, please refer to [json.dump()](https://docs.python.org/3/library/json.html#json.dump)\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n\r\nJDKSObject.delete(\"version\")\r\nJDKSObject.delete(\"release||$0$\")\r\nJDKSObject.delete(\"snapshot\")\r\n\r\nprint(JDKSObject.dumps())\r\n# OUTPUT: {\"author\": \"truocphan\", \"version\": \"latest\", \"release\": []}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.dump(`Jfilepath`, `dupSign_start`=\"{{{\", `dupSign_end`=\"}}}\", `_isDebug_`=False, `skipkeys`=False, `ensure_ascii`=True, `check_circular`=True, `allow_nan`=True, `cls`=None, `indent`=None, `separators`=None, `default`=None, `sort_keys`=False)\r\n_Serialize a JSON object to a JSON format string and write to a file_\r\n- `Jfilepath`: the path to the file to save the JSON format string\r\n- `dupSign_start`: Start symbol for marking duplicates (default: `{{{`)\r\n- `dupSign_end`: End symbol for marking duplicates (default: `}}}`)\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n- For remaining arguments, please refer to [json.dump()](https://docs.python.org/3/library/json.html#json.dump)\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n\r\nJDKSObject.delete(\"version\")\r\nJDKSObject.delete(\"release||$0$\")\r\nJDKSObject.delete(\"snapshot\")\r\n\r\nJfilepath = \"/path/to/file.json\"\r\nJDKSObject.dump(Jfilepath)\r\n\r\nJDKSObject_load = jdks.load(Jfilepath)\r\nprint(JDKSObject_load.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': 'latest', 'release': []}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.flatten(`separator`=\"||\", `parse_index`=\"$\", `ordered_dict`=False, `_isDebug_`=False)\r\n_Flatten a JSON object to a single key-value pairs_\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release\": [{\"version\": \"latest\"}], \"snapshot\": {\"author\": \"truocphan\", \"version\": \"22.3.3\", \"release\": [{\"version\": \"latest\"}]}}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n\r\nJDKSObject.flatten()\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release||$0$||version': 'latest', 'snapshot||author': 'truocphan', 'snapshot||version': '22.3.3', 'snapshot||release||$0$||version': 'latest'}\r\n```\r\n\r\n---\r\n### JSON_DUPLICATE_KEYS.unflatten(`separator`=\"||\", `parse_index`=\"$\", `ordered_dict`=False, `_isDebug_`=False)\r\n_Unflatten a flattened JSON object back to a JSON object_\r\n- `separator`: Separator for flatten keys (default: `||`)\r\n- `parse_index`: Symbol for index parsing (default: `$`)\r\n- `ordered_dict`: preserves the order in which the Keys are inserted\r\n- `_isDebug_`: Show/ Hide debug error messages\r\n```python\r\nimport json_duplicate_keys as jdks\r\n\r\nJstr = '{\"author\": \"truocphan\", \"version\": \"22.3.3\", \"version\": \"latest\", \"release||$0$||version\": \"latest\", \"snapshot||author\": \"truocphan\", \"snapshot||version\": \"22.3.3\", \"snapshot||release||$0$||version\": \"latest\"}'\r\n\r\nJDKSObject = jdks.loads(Jstr)\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release||$0$||version': 'latest', 'snapshot||author': 'truocphan', 'snapshot||version': '22.3.3', 'snapshot||release||$0$||version': 'latest'}\r\n\r\nJDKSObject.unflatten()\r\n\r\nprint(JDKSObject.getObject())\r\n# OUTPUT: {'author': 'truocphan', 'version': '22.3.3', 'version{{{_2_}}}': 'latest', 'release': [{'version': 'latest'}], 'snapshot': {'author': 'truocphan', 'version': '22.3.3', 'release': [{'version': 'latest'}]}}\r\n```\r\n\r\n---\r\n# \ud83d\udcdd CHANGELOG\r\n### [json-duplicate-keys v2025.9.9](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.9.9)\r\n- **Fixed**: Inserting a value with an `empty` or `null` name\r\n\r\n### [json-duplicate-keys v2025.8.19](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.8.19)\r\n- **Updated**: Add an exception when loading a non-existent file\r\n- **Updated**: Dump Unicode characters to a file\r\n\r\n### [json-duplicate-keys v2025.7.1](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.7.1)\r\n- **Updated**: Fixed some issues when loading JSON strings with `skipDuplicated` option\r\n- **Updated**: Allow loading of JSON data in byte string format\r\n- **Updated**: Issue with getting and setting an empty list\r\n\r\n### [json-duplicate-keys v2025.6.6](https://github.com/TPCyberSec/json-duplicate-keys/tree/2025.6.6)\r\n- **Updated** Added `skipDuplicated` parameter to `load` and `loads` functions to improve performance when parsing large JSON strings by skipping duplicate keys.\r\n\r\n### [json-duplicate-keys v2024.12.12](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.12.12)\r\n- **New**: _insert_ function\r\n\r\n### [json-duplicate-keys v2024.11.28](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.11.28)\r\n- **Fixed**: Add subkey name to empty dict of existing key name\r\n\r\n### [json-duplicate-keys v2024.11.19](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.11.19)\r\n- **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\r\n\r\n### [json-duplicate-keys v2024.7.17](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.7.17)\r\n- **Fixed**: issue #3 break the set function when the key's value is empty. Thanks [ptth222](https://github.com/ptth222) for reporting this issue.\r\n\r\n### [json-duplicate-keys v2024.4.20](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.4.20)\r\n- **New**: _filter_values_\r\n- **Updated**: _filter_keys_\r\n\r\n### [json-duplicate-keys v2024.3.24](https://github.com/TPCyberSec/json-duplicate-keys/tree/2024.3.24)\r\n- **Updated**: _normalize_key_, _loads_, _get_, _set_, _update_, _delete_\r\n\r\n---\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "Flatten/ Unflatten and Load(s)/ Dump(s) JSON File/ Object with Duplicate Keys",
    "version": "2025.9.9",
    "project_urls": {
        "Homepage": "https://github.com/TPCyberSec/json-duplicate-keys"
    },
    "split_keywords": [
        "tpcybersec",
        " json",
        " duplicate keys",
        " json duplicate keys",
        " flatten",
        " unflatten"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "e54693a49ce08f6a57efafb6e42e9a42b6ce6d7c8b78f06eb67fd37abf872944",
                "md5": "6aff6199586701f4216e1530fd4de265",
                "sha256": "e1e29b138d092c81146da908e66e985f39dbd97c60b352ac5c7e5df70cee84e8"
            },
            "downloads": -1,
            "filename": "json_duplicate_keys-2025.9.9-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6aff6199586701f4216e1530fd4de265",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 9069,
            "upload_time": "2025-09-09T04:07:45",
            "upload_time_iso_8601": "2025-09-09T04:07:45.928070Z",
            "url": "https://files.pythonhosted.org/packages/e5/46/93a49ce08f6a57efafb6e42e9a42b6ce6d7c8b78f06eb67fd37abf872944/json_duplicate_keys-2025.9.9-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "db65511dc47f90c0d063e307ef2af86ac4fb82b8133bb0934e4644dc185acafd",
                "md5": "df659b2a091853127278ef725ac3b744",
                "sha256": "18e7aa6839509681fb7fe2f560826d6c5e6d5e2d233bd8144700ea2026c5cc5c"
            },
            "downloads": -1,
            "filename": "json_duplicate_keys-2025.9.9.tar.gz",
            "has_sig": false,
            "md5_digest": "df659b2a091853127278ef725ac3b744",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 11907,
            "upload_time": "2025-09-09T04:07:49",
            "upload_time_iso_8601": "2025-09-09T04:07:49.357862Z",
            "url": "https://files.pythonhosted.org/packages/db/65/511dc47f90c0d063e307ef2af86ac4fb82b8133bb0934e4644dc185acafd/json_duplicate_keys-2025.9.9.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-09 04:07:49",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "TPCyberSec",
    "github_project": "json-duplicate-keys",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "json-duplicate-keys"
}
        
Elapsed time: 0.48471s