diff --git a/homeassistant/util/json.py b/homeassistant/util/json.py index e906462a250..2ce98ffef77 100644 --- a/homeassistant/util/json.py +++ b/homeassistant/util/json.py @@ -112,12 +112,15 @@ def find_paths_unserializable_data( except (ValueError, TypeError): pass - # We convert states and events to dict so we can find bad data inside it - if isinstance(obj, State): - obj_path += f"(state: {obj.entity_id})" - obj = obj.as_dict() - elif isinstance(obj, Event): - obj_path += f"(event: {obj.event_type})" + # We convert objects with as_dict to their dict values so we can find bad data inside it + if hasattr(obj, "as_dict"): + desc = obj.__class__.__name__ + if isinstance(obj, State): + desc += f": {obj.entity_id}" + elif isinstance(obj, Event): + desc += f": {obj.event_type}" + + obj_path += f"({desc})" obj = obj.as_dict() if isinstance(obj, dict): diff --git a/tests/components/websocket_api/test_http.py b/tests/components/websocket_api/test_http.py index d3cf4b854f8..f3952f1dc4b 100644 --- a/tests/components/websocket_api/test_http.py +++ b/tests/components/websocket_api/test_http.py @@ -67,7 +67,7 @@ async def test_pending_msg_peak(hass, mock_low_peak, hass_ws_client, caplog): async def test_non_json_message(hass, websocket_client, caplog): - """Test trying to serialze non JSON objects.""" + """Test trying to serialize non JSON objects.""" bad_data = object() hass.states.async_set("test_domain.entity", "testing", {"bad": bad_data}) await websocket_client.send_json({"id": 5, "type": "get_states"}) @@ -77,6 +77,6 @@ async def test_non_json_message(hass, websocket_client, caplog): assert msg["type"] == const.TYPE_RESULT assert not msg["success"] assert ( - f"Unable to serialize to JSON. Bad data found at $.result[0](state: test_domain.entity).attributes.bad={bad_data}(" + f"Unable to serialize to JSON. Bad data found at $.result[0](State: test_domain.entity).attributes.bad={bad_data}(" in caplog.text ) diff --git a/tests/util/test_json.py b/tests/util/test_json.py index 1cbaaae7d23..1d82f5972a3 100644 --- a/tests/util/test_json.py +++ b/tests/util/test_json.py @@ -153,7 +153,7 @@ def test_find_unserializable_data(): [State("mock_domain.mock_entity", "on", {"bad": bad_data})], dump=partial(dumps, cls=MockJSONEncoder), ) - == {"$[0](state: mock_domain.mock_entity).attributes.bad": bad_data} + == {"$[0](State: mock_domain.mock_entity).attributes.bad": bad_data} ) assert ( @@ -161,5 +161,20 @@ def test_find_unserializable_data(): [Event("bad_event", {"bad_attribute": bad_data})], dump=partial(dumps, cls=MockJSONEncoder), ) - == {"$[0](event: bad_event).data.bad_attribute": bad_data} + == {"$[0](Event: bad_event).data.bad_attribute": bad_data} + ) + + class BadData: + def __init__(self): + self.bla = bad_data + + def as_dict(self): + return {"bla": self.bla} + + assert ( + find_paths_unserializable_data( + BadData(), + dump=partial(dumps, cls=MockJSONEncoder), + ) + == {"$(BadData).bla": bad_data} )