from functools import reduce import re import pprint def array_parser(data): if data[0] != "[": return None parse_list = [] data = data[1:].strip() while len(data): res = value_parser(data) if res is None: return None parse_list.append(res[0]) data = res[1].strip() if data[0] == "]": return [parse_list, data[1:].strip()] res = comma_parser(data) if res is None: return None data = res[1].strip() def boolean_parser(data): if data[0:4] == "true": return [True, data[4:].strip()] elif data[0:5] == "false": return [False, data[5:].strip()] def colon_parser(data): if data[0] == ":": return [data[0], data[1:].lstrip()] def comma_parser(data): if data and data[0] == ",": return [data[0], data[1:].strip()] def null_parser(data): if data[0:4] == "null": return [None, data[4:].strip()] def number_parser(data): regex_find = re.findall("^(-?(?:[0-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?)", data) if not regex_find: return None pos = len(regex_find[0]) try: return [int(regex_find[0]), data[pos:].strip()] except ValueError: return [float(regex_find[0]), data[pos:].strip()] def object_parser(data): if data[0] != "{": return None parse_dict = {} data = data[1:].strip() while data[0] != "}": res = string_parser(data) if res is None: return None id = res[0] res = colon_parser(res[1].strip()) if res is None: return None res = value_parser(res[1].strip()) if res is None: return None parse_dict[id] = res[0] data = res[1].lstrip() res = comma_parser(data) if res: data = res[1].strip() return [parse_dict, data[1:]] def string_parser(data): if data[0] == '"': data = data[1:] pos = data.find('"') return [data[:pos], data[pos + 1:].strip()] def all_parsers(*args): return lambda data: (reduce(lambda f, g: f if f(data) else g, args)(data)) value_parser = all_parsers(null_parser, number_parser, boolean_parser, string_parser, object_parser, array_parser) def main(): file_name = "PBK\Fuzzing\ProjectToFuzzTest\Examples\ex1.json" with open(file_name, "r") as f: data = f.read() res = value_parser(data.strip()) try: pprint.pprint(res[0]) except TypeError: print(None) if __name__ == "__main__": main()