Flatten/ Unflatten and Load(s)/ Dump(s) JSON File/ Object with Duplicate Keys


Keywords
TPCyberSec, json, duplicate, keys, flatten, unflatten, json-duplicate-keys, json-flatten, json-unflatten
License
MIT
Install
pip install json-duplicate-keys==2024.4.20

Documentation

JSON Duplicate Keys - PyPI

Flatten/ Unflatten and Load(s)/ Dump(s) JSON File/ Object with Duplicate Keys

Installation

From PyPI:

pip install json-duplicate-keys

From Source:

git clone https://github.com/truocphan/json-duplicate-keys.git --branch <Branch/Tag>
cd json-duplicate-keys
python setup.py build
python setup.py install

Basic Usage

normalize_key(name, dupSign_start="{{{", dupSign_end="}}}", _isDebug_=False)

Normalize Key name

  • name: key name
  • dupSign_start:
  • dupSign_end:
  • _isDebug_: Show/ Hide debug error messages
import json_duplicate_keys as jdks

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

loads(Jstr, dupSign_start="{{{", dupSign_end="}}}", ordered_dict=False, _isDebug_=False)

Deserialize a JSON format string to a class JSON_DUPLICATE_KEYS

  • Jstr: a JSON format string
  • dupSign_start:
  • dupSign_end:
  • ordered_dict: preserves the order in which the Keys are inserted
  • _isDebug_: Show/ Hide debug error messages
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, _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:
  • dupSign_end:
  • ordered_dict: preserves the order in which the Keys are inserted
  • _isDebug_: Show/ Hide debug error messages
# /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

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, 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
  • separator:
  • parse_index:
  • _isDebug_: Show/ Hide debug error messages
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: latest

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

print(JDKSObject.get("snapshot||author"))
# OUTPUT: truocphan

JSON_DUPLICATE_KEYS.set(name, value, 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
  • separator:
  • parse_index:
  • dupSign_start:
  • dupSign_end:
  • ordered_dict: preserves the order in which the Keys are inserted
  • _isDebug_: Show/Hide debug error messages
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'}}


Jstr = '[]'
JDKSObject = jdks.loads(Jstr)

print(JDKSObject.getObject())
# OUTPUT: []

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

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

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

JSON_DUPLICATE_KEYS.update(name, value, separator="||", parse_index="$", _isDebug_=False)

Update new value for existing name in the JSON object

  • name: the key name of the JSON object. Supported flatten key name format
  • value: new value for key name
  • separator:
  • parse_index:
  • _isDebug_: Show/ Hide debug error messages
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, 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
  • separator:
  • parse_index:
  • _isDebug_: Show/ Hide debug error messages
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)

  • name:
  • separator:
  • parse_index:
  • ordered_dict:
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)

  • value:
  • separator:
  • parse_index:
  • ordered_dict:
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:
  • dupSign_end:
  • _isDebug_: Show/ Hide debug error messages
  • For remaining arguments, please refer to json.dump()
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:
  • dupSign_end:
  • _isDebug_: Show/ Hide debug error messages
  • For remaining arguments, please refer to json.dump()
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:
  • parse_index:
  • ordered_dict: preserves the order in which the Keys are inserted
  • _isDebug_: Show/ Hide debug error messages
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:
  • parse_index:
  • ordered_dict: preserves the order in which the Keys are inserted
  • _isDebug_: Show/ Hide debug error messages
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

  • Fixed: issue #3 break the set function when the key's value is empty. Thanks ptth222 for reporting this issue.
  • New: filter_values
  • Updated: filter_keys
  • Updated: normalize_key, loads, get, set, update, delete