Source code for triad.utils.json
import json
from typing import Any, Dict, Hashable, List, Tuple
[docs]def loads_no_dup(json_str: str) -> Any:
"""Load json string, and raise KeyError if there are duplicated keys
:param json_str: json string
:raises KeyError: if there are duplicated keys
:return: the parsed object
"""
return json.loads(json_str, object_pairs_hook=check_for_duplicate_keys)
[docs]def check_for_duplicate_keys(
ordered_pairs: List[Tuple[Hashable, Any]]
) -> Dict[Any, Any]:
"""Raise ValueError if a duplicate key exists in provided ordered list of pairs,
otherwise return a dict.
Example:
>>> json.loads('{"x": 1, "x": 2}', object_pairs_hook=check_for_duplicate_keys)
:raises KeyError: if there is duplicated key
"""
dict_out: Dict[Any, Any] = {}
for key, val in ordered_pairs:
if key in dict_out:
raise KeyError(f"Duplicate key: {key}")
else:
dict_out[key] = val
return dict_out