From 3b048f66c54e48607d195eef84e1746589492f39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hunor=20Kova=CC=81cs?= Date: Mon, 4 May 2015 18:57:22 +0300 Subject: [PATCH] Arrays are supported as well. format: `alpha.beta[2].gamma.theta[0]` Fix: Now keys that are in the middle of the expression that are not found in the data, can be checked upon, without the script throwing an error. --- check_http_json.py | 45 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 6 deletions(-) diff --git a/check_http_json.py b/check_http_json.py index 30a06b8..1491e22 100755 --- a/check_http_json.py +++ b/check_http_json.py @@ -46,6 +46,27 @@ class JsonHelper: self.data = json_data self.separator = separator + def getSubElement(self, key, data): + separatorIndex = key.find(self.separator) + partialKey = key[:separatorIndex] + remainingKey = key[separatorIndex + 1:] + if partialKey in data: + return self.get(remainingKey, data[partialKey]) + else: + return (None, 'not_found') + + def getSubArrayElement(self, key, data): + subElemKey = key[:key.find('[')] + index = int(key[key.find('[') + 1:key.find(']')]) + remainingKey = key[key.find('].') + 2:] + if subElemKey in data: + if index < len(data[subElemKey]): + return self.get(remainingKey, data[subElemKey][index]) + else: + return (None, 'not_found') + else: + return (None, 'not_found') + def equals(self, key, value): return self.exists(key) and str(self.get(key)) == value def lte(self, key, value): return self.exists(key) and float(self.get(key)) <= float(value) def gte(self, key, value): return self.exists(key) and float(self.get(key)) >= float(value) @@ -57,13 +78,25 @@ class JsonHelper: else: data = self.data - if self.separator in key: - return self.get(key[key.find(self.separator) + 1:], data[key[:key.find(self.separator)]]) - else: - if key in data: - return data[key] + if len(key) <= 0: + return data + + if key.find(self.separator) != -1 and key.find('[') != -1 : + if key.find(self.separator) < key.find('[') : + return self.getSubElement(key, data) else: - return (None, 'not_found') + return self.getSubArrayElement(key, data) + else: + if key.find(self.separator) != -1 : + return self.getSubElement(key, data) + else: + if key.find('[') != -1 : + return self.getSubArrayElement(key, data) + else: + if key in data: + return data[key] + else: + return (None, 'not_found') class JsonRuleProcessor: """Perform checks and gather values from a JSON dict given rules and metrics definitions"""