# This script has two modes. # # extract-json-keys.py []: # Opens and then extracts, sorts and prints all keys. When # omitting or passing '-', the script reads from STDIN. # # extract-json-keys.py : # Opens and checks whether all keys from appear, # whereas is either a comma-separated list or a file path prefixed # with an '@'. import json import sys keys = [] def rec_scan_keys(xs, prefix): for key, val in xs.items(): if not prefix: full_key = key else: full_key = f"{prefix}.{key}" keys.append(full_key) if type(val) is dict: rec_scan_keys(val, full_key) def do_scan(fname): if fname == "-": rec_scan_keys(json.load(sys.stdin), None) return with open(fname) as f: rec_scan_keys(json.load(f), None) do_scan("-" if len(sys.argv) < 2 else sys.argv[1]) # Mode 2? Check all keys. if len(sys.argv) == 3: # Get the keys we are looking for. required_keys = [] ls = sys.argv[2] if ls.startswith("@"): with open(ls[1:]) as f: required_keys = [line.rstrip() for line in f] else: required_keys.split(",") # Check that each required key exists in the input. print(f"required_keys: {required_keys}") for key in required_keys: if not key in keys: sys.exit(1) sys.exit(0) # Mode 1: just print the keys. keys.sort() for key in keys: print(key)