import json from copy import deepcopy from jay_diff import jay_diff_full, jay_merge_full def deep_diff(data, temp_data): new_data = {} for k in data.keys(): if isinstance(data[k], dict): if k not in temp_data: temp_data[k] = {} temp = deep_diff(data[k], temp_data[k]) if temp: new_data[k] = {} new_data[k] = temp else: if k in temp_data: if data[k] != temp_data[k]: new_data[k] = data[k] else: new_data[k] = data[k] return new_data def deep_merge(d, u, only_existing=True): for k, v in u.items(): if isinstance(v, dict): if only_existing: r = deep_merge(d.get(k, {}), v) d[k] = r else: d[k] = v else: d[k] = u[k] return d def main() -> None: files = [ "results/WVWZZZE1ZMP010760/2024/10/18/vehicle_WVWZZZE1ZMP010760_2024-10-15T12-05-23.json", "results/WVWZZZE1ZMP010760/2024/10/19/vehicle_WVWZZZE1ZMP010760_2024-10-19T00-00-34.json", "results/WVWZZZE1ZMP010760/2024/10/20/vehicle_WVWZZZE1ZMP010760_2024-10-20T17-33-04.json" ] for diff_mode_update_add in [True, False]: for file in files: print(f"-----------------------------------------------------------------------------------------------------------------") print(f"--- Using file {file}, diff_mode_update_add={diff_mode_update_add}") print(f"-----------------------------------------------------------------------------------------------------------------") with open(file, "r") as fp: src = json.load(fp) src_last = {} diffed_list = [] last = {} for s in src: print(f"Old: {last}") print(f"New: {s}") diffed = jay_diff_full(last, s, combine_upd_add=diff_mode_update_add) print(f"Diffed: {diffed}") diffed_list.append(deepcopy(diffed)) last = deepcopy(s) merged_list = [] last = {} for d in diffed_list: print(f"Old: {last}") print(f"Diff: {d}") merged = jay_merge_full(last, d) print(f"Merged: {merged}") last = deepcopy(merged) merged_list.append(deepcopy(merged)) # Check integrity assert src == merged_list if __name__ == '__main__': main()