diff --git a/homeassistant/util/json.py b/homeassistant/util/json.py index 8a9663bb95d..d69a4106728 100644 --- a/homeassistant/util/json.py +++ b/homeassistant/util/json.py @@ -45,6 +45,13 @@ def load_json(filename: str, default: list | dict | None = None) -> list | dict: 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( filename: str, data: list | dict, @@ -62,8 +69,8 @@ def save_json( if encoder: json_data = json.dumps(data, indent=2, cls=encoder) else: - dump = orjson.dumps - json_data = orjson.dumps(data, option=orjson.OPT_INDENT_2).decode("utf-8") + dump = _orjson_encoder + json_data = _orjson_encoder(data) 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))}" _LOGGER.error(msg) diff --git a/tests/util/test_json.py b/tests/util/test_json.py index abf47b0bc53..9974cbb9628 100644 --- a/tests/util/test_json.py +++ b/tests/util/test_json.py @@ -52,6 +52,14 @@ def test_save_and_load(): 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(): """Test we can load private files and that they are protected.""" fname = _path_for("test2")