Refactor JSON attribute parsing in rest (#97526)

* Refactor JSON attribute parsing in rest

* Early return
This commit is contained in:
epenet 2023-08-11 11:00:55 +02:00 committed by GitHub
parent 832a8247de
commit c62081430b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 28 deletions

View file

@ -0,0 +1,40 @@
"""Helpers for RESTful API."""
import logging
from typing import Any
from jsonpath import jsonpath
from homeassistant.util.json import json_loads
_LOGGER = logging.getLogger(__name__)
def parse_json_attributes(
value: str | None, json_attrs: list[str], json_attrs_path: str | None
) -> dict[str, Any]:
"""Parse JSON attributes."""
if not value:
_LOGGER.warning("Empty reply found when expecting JSON data")
return {}
try:
json_dict = json_loads(value)
if json_attrs_path is not None:
json_dict = jsonpath(json_dict, json_attrs_path)
# jsonpath will always store the result in json_dict[0]
# so the next line happens to work exactly as needed to
# find the result
if isinstance(json_dict, list):
json_dict = json_dict[0]
if isinstance(json_dict, dict):
return {k: json_dict[k] for k in json_attrs if k in json_dict}
_LOGGER.warning(
"JSON result was not a dictionary or list with 0th element a dictionary"
)
except ValueError:
_LOGGER.warning("REST result could not be parsed as JSON")
_LOGGER.debug("Erroneous JSON: %s", value)
return {}