in esrally/driver/runner.py [0:0]
def parse(text: BytesIO, props: list[str], lists: list[str] = None, objects: list[str] = None) -> dict:
"""
Selectively parse the provided text as JSON extracting only the properties provided in ``props``. If ``lists`` is
specified, this function determines whether the provided lists are empty (respective value will be ``True``) or
contain elements (respective key will be ``False``). If ``objects`` is specified, it will in addition extract
the JSON objects under the given keys. These JSON objects must be flat dicts, only containing primitive types
within.
:param text: A text to parse.
:param props: A mandatory list of property paths (separated by a dot character) for which to extract values.
:param lists: An optional list of property paths to JSON lists in the provided text.
:param objects: An optional list of property paths to flat JSON objects in the provided text.
:return: A dict containing all properties, lists, and flat objects that have been found in the provided text.
"""
text.seek(0)
parser = ijson.parse(text)
parsed = {}
parsed_lists = {}
current_object = {}
current_list = None
expect_end_array = False
parsed_objects = {}
in_object = None
try:
for prefix, event, value in parser:
if expect_end_array:
# True if the list is empty, False otherwise
parsed_lists[current_list] = event == "end_array"
expect_end_array = False
if prefix in props:
parsed[prefix] = value
elif lists is not None and prefix in lists and event == "start_array":
current_list = prefix
expect_end_array = True
elif objects is not None and event == "end_map" and prefix in objects:
parsed_objects[in_object] = current_object
in_object = None
elif objects is not None and event == "start_map" and prefix in objects:
in_object = prefix
current_object = {}
elif in_object and event in ["boolean", "integer", "double", "number", "string"]:
current_object[prefix[len(in_object) + 1 :]] = value
# found all necessary properties
if (
len(parsed) == len(props)
and (lists is None or len(parsed_lists) == len(lists))
and (objects is None or len(parsed_objects) == len(objects))
):
break
except ijson.IncompleteJSONError:
# did not find all properties
pass
parsed.update(parsed_lists)
parsed.update(parsed_objects)
return parsed