diff --git a/unfurl/parsers/parse_json.py b/unfurl/parsers/parse_json.py
index 5618084..abacd6b 100644
--- a/unfurl/parsers/parse_json.py
+++ b/unfurl/parsers/parse_json.py
@@ -1,4 +1,4 @@
-# Copyright 2019 Google LLC
+# Copyright 2025 Ryan Benson
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -25,13 +25,15 @@
'label': 'JSON'
}
+json_hover_text = ('This was parsed as JavaScript Object Notation (JSON),
'
+ 'which uses human-readable text to store and transmit data objects')
def run(unfurl, node):
if node.data_type in ('url.query.pair', 'string'):
try:
json_obj = json.loads(node.value)
- assert isinstance(json_obj, dict), 'Loaded object should be a dict'
+ assert isinstance(json_obj, (dict, list)), 'Loaded object should be a dict or a list'
except json.JSONDecodeError:
return
@@ -41,13 +43,16 @@ def run(unfurl, node):
return
try:
-
- for json_key, json_value in json_obj.items():
- unfurl.add_to_queue(
- data_type='json', key=json_key, value=json_value, label=f'{json_key}: {json_value}',
- hover='This was parsed as JavaScript Object Notation (JSON),
'
- 'which uses human-readable text to store and transmit data objects',
- parent_id=node.node_id, incoming_edge_config=json_edge)
+ if isinstance(json_obj, dict):
+ for json_key, json_value in json_obj.items():
+ unfurl.add_to_queue(
+ data_type='json', key=json_key, value=json_value, label=f'{json_key}: {json_value}',
+ hover=json_hover_text, parent_id=node.node_id, incoming_edge_config=json_edge)
+ elif isinstance(json_obj, list):
+ for item in json_obj:
+ unfurl.add_to_queue(
+ data_type='json', key=None, value=item, label=f'[{len(item)} items]',
+ hover=json_hover_text, parent_id=node.node_id, incoming_edge_config=json_edge)
except Exception as e:
log.exception(f'Exception parsing JSON string: {e}')
@@ -63,10 +68,33 @@ def run(unfurl, node):
if isinstance(node_value, dict):
try:
for key, value in node_value.items():
+ if isinstance(value, dict):
+ unfurl.add_to_queue(
+ data_type='json', key=key, value=value, label=f'{key}: {{{len(value)} keys}}',
+ hover='This was parsed as JavaScript Object Notation (JSON),
'
+ 'which uses human-readable text to store and transmit data objects',
+ parent_id=node.node_id, incoming_edge_config=json_edge)
+ elif isinstance(value, list):
+ unfurl.add_to_queue(
+ data_type='json', key=key, value=value, label=f'{key}: [{len(value)} items]',
+ hover='This was parsed as JavaScript Object Notation (JSON),
'
+ 'which uses human-readable text to store and transmit data objects',
+ parent_id=node.node_id, incoming_edge_config=json_edge)
+ else:
+ unfurl.add_to_queue(
+ data_type='json', key=key, value=value, label=f'{key}: {value}',
+ hover='This was parsed as JavaScript Object Notation (JSON),
'
+ 'which uses human-readable text to store and transmit data objects',
+ parent_id=node.node_id, incoming_edge_config=json_edge)
+
+ except Exception as e:
+ log.exception(f'Exception parsing JSON: {e}')
+
+ elif isinstance(node_value, list):
+ try:
+ for value in node_value:
unfurl.add_to_queue(
- data_type='json', key=key, value=value, label=f'{key}: {value}',
- hover='This was parsed as JavaScript Object Notation (JSON),
'
- 'which uses human-readable text to store and transmit data objects',
+ data_type='json', key=None, value=value, hover=json_hover_text,
parent_id=node.node_id, incoming_edge_config=json_edge)
except Exception as e: