Handle non-str keys when storing json data (#73958)
This commit is contained in:
parent
b880a05e45
commit
1866a1e925
2 changed files with 17 additions and 2 deletions
|
@ -45,6 +45,13 @@ def load_json(filename: str, default: list | dict | None = None) -> list | dict:
|
||||||
return {} if default is None else default
|
return {} if default is None else default
|
||||||
|
|
||||||
|
|
||||||
|
def _orjson_encoder(data: Any) -> str:
|
||||||
|
"""JSON encoder that uses orjson."""
|
||||||
|
return orjson.dumps(
|
||||||
|
data, option=orjson.OPT_INDENT_2 | orjson.OPT_NON_STR_KEYS
|
||||||
|
).decode("utf-8")
|
||||||
|
|
||||||
|
|
||||||
def save_json(
|
def save_json(
|
||||||
filename: str,
|
filename: str,
|
||||||
data: list | dict,
|
data: list | dict,
|
||||||
|
@ -62,8 +69,8 @@ def save_json(
|
||||||
if encoder:
|
if encoder:
|
||||||
json_data = json.dumps(data, indent=2, cls=encoder)
|
json_data = json.dumps(data, indent=2, cls=encoder)
|
||||||
else:
|
else:
|
||||||
dump = orjson.dumps
|
dump = _orjson_encoder
|
||||||
json_data = orjson.dumps(data, option=orjson.OPT_INDENT_2).decode("utf-8")
|
json_data = _orjson_encoder(data)
|
||||||
except TypeError as error:
|
except TypeError as error:
|
||||||
msg = f"Failed to serialize to JSON: {filename}. Bad data at {format_unserializable_data(find_paths_unserializable_data(data, dump=dump))}"
|
msg = f"Failed to serialize to JSON: {filename}. Bad data at {format_unserializable_data(find_paths_unserializable_data(data, dump=dump))}"
|
||||||
_LOGGER.error(msg)
|
_LOGGER.error(msg)
|
||||||
|
|
|
@ -52,6 +52,14 @@ def test_save_and_load():
|
||||||
assert data == TEST_JSON_A
|
assert data == TEST_JSON_A
|
||||||
|
|
||||||
|
|
||||||
|
def test_save_and_load_int_keys():
|
||||||
|
"""Test saving and loading back stringifies the keys."""
|
||||||
|
fname = _path_for("test1")
|
||||||
|
save_json(fname, {1: "a", 2: "b"})
|
||||||
|
data = load_json(fname)
|
||||||
|
assert data == {"1": "a", "2": "b"}
|
||||||
|
|
||||||
|
|
||||||
def test_save_and_load_private():
|
def test_save_and_load_private():
|
||||||
"""Test we can load private files and that they are protected."""
|
"""Test we can load private files and that they are protected."""
|
||||||
fname = _path_for("test2")
|
fname = _path_for("test2")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue