Рекурсивный: Различия в файлах JSON, которые печатаются не так, как ожидалось

#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')) вместо этого.