実現したいこと
ユーザに差分を確認したい"value"の"key"を入力して貰う事で、
before,afterの"object"の値と"value"の差分(確認する差分はvalueのみ)を抽出する。
前提
差分を以下のように出力させたいです。
Tokyo before number:1 after number:2 Aichi before number:1 after number:2
発生している問題・エラーメッセージ
sampleとなるJSONです。(before,after)
{ "address": { "Tokyo": { "name": { "age": 18 }, "Osaka": "Test", "number": "1" }, "Aichi": { "name": { "age": 18 }, "Osaka": "Test", "number": "1" } } }
{ "address": { "Tokyo": { "name": { "age": 18 }, "Osaka": "Test", "number": "2" }, "Aichi": { "name": { "age": 18 }, "Osaka": "Test", "number": "2" } } }
Pythonのコード
import json cmd = str(input()) def dict_before_search(d,key): if not d or not key: return None elif isinstance(d,dict): if key in d: global arry_before arry_before += str(d.get(key)) + " " return d.get(key) else: l = [dict_before_search(d.get(dkey),key) for dkey in d if isinstance(d.get(dkey),dict) or isinstance(d.get(dkey),list)] return [lv for lv in l if not lv is None].pop(0) if any(l) else None elif isinstance(d,list): li = [dict_before_search(e,key) for e in d if isinstance(e,dict) or isinstance(e,list)] return [liv for liv in li if not liv is None].pop(0) if any(li) else None else: return None def dict_after_search(d,key): if not d or not key: return None elif isinstance(d,dict): if key in d: global arry_after arry_after += str(d.get(key)) + " " return d.get(key) else: l = [dict_after_search(d.get(dkey),key) for dkey in d if isinstance(d.get(dkey),dict) or isinstance(d.get(dkey),list)] return [lv for lv in l if not lv is None].pop(0) if any(l) else None elif isinstance(d,list): li = [dict_after_search(e,key) for e in d if isinstance(e,dict) or isinstance(e,list)] return [liv for liv in li if not liv is None].pop(0) if any(li) else None else: return None json_before_file = open("jsonファイルのパス","r") json_before = json.load(json_before_file) arry_before = "" result_before = dict_before_search(json_before,cmd) arry_before = arry_before.split() json_after_file = open("jsonファイルのパス","r") json_after = json.load(json_after_file) arry_after = "" result_after = dict_after_search(json_after,cmd) arry_after = arry_after.split() for i in range(len(arry_before)): if (arry_before[i] != arry_after[i]): print(f"before {cmd}:{arry_before[i]}") print(f"after {cmd}:{arry_after[i]}") # 出力結果 # before number:1 # after number:2 # before number:1 # after number:2
試したこと
可読性低くて申し訳ございません。
上記のプログラムでユーザ側に"key"を入力して貰う事で、"value"の差分までは確認出来るプログラムは書けたんですが、"object"の値を特定するプログラムが思いつきません。
分かりにくい文章で申し訳ないです。有識者の皆様お力をお貸しいただけると幸いですm(__)m
補足情報(FW/ツールのバージョンなど)
実装環境
python: 3.9.4

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/10/22 12:15