Skip to content

Commit b3a7a78

Browse files
committed
added partial key
1 parent 9b5ee4b commit b3a7a78

File tree

1 file changed

+28
-13
lines changed

1 file changed

+28
-13
lines changed

src/jsonparse/parser.py

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,13 @@ def __init__(self, stack_trace=False, queue_trace=False):
5151
self.stack_ref = self._stack_init()
5252
self.queue_ref = self._queue_init()
5353

54-
def find_key(self, data, key):
54+
def find_key(self, data, key, partial, case_sensitive):
5555
# type: (Union[dict, list, OrderedDict], str) -> list
5656
if not self._valid_key_input(data, key):
5757
raise
58+
59+
if partial and len(key)==0:
60+
raise
5861

5962
self.stack_ref = self._stack_init() # init a new queue every request
6063
self._stack_push(data)
@@ -66,16 +69,19 @@ def find_key(self, data, key):
6669

6770
elem = self._stack_pop()
6871

69-
if type(elem) is list:
72+
if isinstance(elem,list):
7073
self._stack_push_list_elem(elem)
7174
elif isinstance(elem, (dict, OrderedDict)):
72-
value = self._stack_all_key_values_in_dict(key, elem)
75+
value = self._stack_all_key_values_in_dict(key, elem, partial, case_sensitive)
7376
if value:
7477
for v in value:
75-
value_list.insert(0, v)
78+
if isinstance(v,list):
79+
value_list.extend([item for item in v])
80+
else:
81+
value_list.insert(0, v)
7682
else: # according to RFC 7159, valid JSON can also contain a
77-
# string, number, 'false', 'null', 'true'
78-
pass # discard these other values as they don't have a key
83+
# string, number, 'false', 'null', 'true'
84+
pass # discard these other values as they don't have a key
7985

8086
return value_list
8187

@@ -241,7 +247,7 @@ def _stack_push_list_elem(self, elem):
241247
self._stack_push(e)
242248
self._stack_trace()
243249

244-
def _stack_all_key_values_in_dict(self, key, elem):
250+
def _stack_all_key_values_in_dict(self, key, elem, partial, case_sensitive):
245251
# type: (str, Union[dict, OrderedDict]) -> list
246252
value_list = []
247253

@@ -253,12 +259,21 @@ def _stack_all_key_values_in_dict(self, key, elem):
253259
if len(elem) <= 0: # don't want an empty dict on the stack
254260
pass
255261
else:
256-
for e in elem:
257-
if e == key:
258-
value_list.append(elem[e])
262+
value_list=[]
263+
264+
for actual_key, value in elem.items():
265+
match_key = actual_key if case_sensitive else actual_key.lower()
266+
search_key = key if case_sensitive else key.lower()
267+
if partial:
268+
if search_key in match_key:
269+
value_list.append(value)
259270
else:
260-
self._stack_push(elem[e])
261-
self._stack_trace()
271+
if match_key == search_key:
272+
value_list.append(value)
273+
if not (partial and search_key in match_key) and not (not partial and match_key == search_key):
274+
if isinstance(value, (dict, list, OrderedDict)):
275+
self._stack_push(value)
276+
self._stack_trace()
262277
return value_list
263278

264279
def _stack_all_keys_values_in_dict(self, keys, elem):
@@ -461,4 +476,4 @@ def _valid_value_input(self, data, value):
461476
raise TypeError
462477
elif not isinstance(value, (str, int, float, bool, type(None))):
463478
raise TypeError
464-
return True
479+
return True

0 commit comments

Comments
 (0)