#python #json #recursion #comparison
#питон #json #рекурсия #сравнение
Вопрос:
Я создаю код для просмотра файлов JSON и печати различий. Я создал два файла JSON с общими данными для сравнения файлов примеров.
Мой Код:
import json from recursive_diff import recursive_eq lhs = json.loads('sample1.json') rhs = json.loads('sample2.json') def test1(): recursive_eq(lhs, rhs)
Выход:
(Личная информация отредактирована.)
(env) --$ /Users/--/env/bin/python3.9 /Users/c/Desktop/--/json_compare_recursive.py Traceback (most recent call last): File "/Users/--/Desktop/--/json_compare_recursive.py", line 4, in lt;modulegt; lhs = json.loads('sample1.json') File "/usr/local/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/__init__.py", line 346, in loads return _default_decoder.decode(s) File "/usr/local/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/usr/local/Cellar/python@3.9/3.9.7_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Желаемый результат:
Я хочу, чтобы он явно печатал каждую разницу между двумя файлами JSON. Например, для целей (фактический результат будет другим):
6 differences found Ln 5, Col 22: , not in lhs Ln 37, Col 30: "batters": { "batter": [ { "id": "1001", "type": "Regular" }, { "id": "1002", "type": "Chocolate" } ] }, not in lhs Ln 50, Col 28: 5 not in rhs
Есть какие-нибудь предложения о наиболее эффективном способе достижения этой цели?
пример1.код json:
[ { "id": "0001", "type": "donut", "name": "Cake", "ppu": 0.55, "batters": { "batter": [ { "id": "1001", "type": "Regular" }, { "id": "1002", "type": "Chocolate" }, { "id": "1003", "type": "Blueberry" }, { "id": "1004", "type": "Devil's Food" } ] }, "topping": [ { "id": "5001", "type": "None" }, { "id": "5002", "type": "Glazed" }, { "id": "5005", "type": "Sugar" }, { "id": "5007", "type": "Powdered Sugar" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5003", "type": "Chocolate" }, { "id": "5004", "type": "Maple" } ] } ]
образец 2.код json:
[ { "id": "0001", "type": "donut", "name": "Cake", "ppu": 0.55, "batters": { "batter": [ { "id": "1001", "type": "Regular" }, { "id": "1002", "type": "Chocolate" }, { "id": "1003", "type": "Blueberry" }, { "id": "1004", "type": "Devil's Food" } ] }, "topping": [ { "id": "5001", "type": "None" }, { "id": "5002", "type": "Glazed" }, { "id": "5005", "type": "Sugar" }, { "id": "5007", "type": "Powdered Sugar" }, { "id": "5006", "type": "Chocolate with Sprinkles" }, { "id": "5003", "type": "Chocolate" }, { "id": "5004", "type": "Maple" } ] }, { "id": "0002", "type": "donut", "name": "Raised", "ppu": 0.55, "batters": { "batter": [ { "id": "1001", "type": "Regular" } ] }, "topping": [ { "id": "5001", "type": "None" }, { "id": "5002", "type": "Glazed" }, { "id": "5005", "type": "Sugar" }, { "id": "5003", "type": "Chocolate" }, { "id": "5004", "type": "Maple" } ] }, { "id": "0003", "type": "donut", "name": "Old Fashioned", "ppu": 0.55, "batters": { "batter": [ { "id": "1001", "type": "Regular" }, { "id": "1002", "type": "Chocolate" } ] }, "topping": [ { "id": "5001", "type": "None" }, { "id": "5002", "type": "Glazed" }, { "id": "5003", "type": "Chocolate" }, { "id": "5004", "type": "Maple" } ] } ]
Комментарии:
1.
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
Похоже, файл json пуст.2. Я согласен, это действительно так выглядит; однако ни один файл не пуст. Я отредактировал свой вопрос, чтобы включить фактический код в каждый файл json.
3. Я не получаю никаких ошибок при загрузке этого файла с образцом. Вы уверены , что именно этот файл используется этим кодом? Возможно, код на самом деле читает другой файл с тем же именем в другом каталоге?
4. Хм, интересно. Да, я уверен, что используется именно этот файл, так как других файлов с таким именем нет.
5. @CODSG В вашем примере кода вы используете
json.loads
, который ожидает содержимое JSON в виде строки, а не имени файла. Вам нужно использоватьjson.load(open('sample1.json'))
вместо этого.