質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1134閲覧

JSONの差分をPythonで確認するプログラム

TanakaHidemaru

総合スコア0

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2023/10/21 10:50

実現したいこと

ユーザに差分を確認したい"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

tatsu99👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

以下は jsondiff · PyPI を利用する場合です。
※ 出力結果を適当に加工してください

python

1import json 2from jsondiff import diff 3 4with open("jsonファイルのパス", "r") as fp: 5 json_before = json.load(fp) 6 7with open("jsonファイルのパス", "r") as fp: 8 json_after = json.load(fp) 9 10diffs = diff(json_before, json_after, syntax='symmetric') 11print(diffs) 12 13# {'address': {'Tokyo': {'number': ['1', '2']}, 'Aichi': {'number': ['1', '2']}}}

投稿2023/10/21 12:44

編集2023/10/21 12:45
melian

総合スコア21118

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TanakaHidemaru

2023/10/22 12:15

ありがとうございます。参考にします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問