Как я могу проверить, есть ли атрибут в списке json? И если его нет, как мне добавить его только туда, где его не хватает?

#python #json

#python #json

Вопрос:

Мне нужно проверить, есть ли у .json файла "quantity": float атрибут во всех списках, и добавить этот атрибут в те места, где его нет отдельно, но я не знаю, как это сделать (у меня нет опыта работы с форматом JSON).

Я пробовал .append и .insert функции, но ни одна из них не работает так, как мне нужно.

У меня есть список, подобный этому:

 {
    "id": 9746439,
    "name": "Home Theater LG com blu-ray 3D, 5.1 canais e 1000W",
    "quantity": 80,
    "price": 2199.0,
    "category": "Eletrônicos"
  },
  {
    "id": 2162952,
    "name": "Kit Gamer acer - Notebook   Headset   Mouse",
    "price": 25599.0,
    "category": "Eletrônicos"
  },
  

Как вы можете видеть, во второй части нет атрибута «количество», и мне нужно добавить его следующим образом "quantity": 0 , но я понятия не имею, как это сделать. Это встречается несколько раз в моем списке, и я хотел бы знать, как я мог бы написать код, который нашел бы эти ошибки и добавил атрибут между «name» и «price», как и в остальной части списка.

Комментарии:

1. Вы можете просто назначить его с помощью записи jsonObject["quantity"] = 0 вам просто нужно пройтись по списку, проверить, есть ли в нем количество, если не присвоить ему значение, как упоминалось ранее.

Ответ №1:

Вероятно, самый простой способ — загрузить файл json в структуру данных Python с помощью json.load() , затем вставить quantity элемент там, где он отсутствует, затем записать его в новый файл json.

 import json

# open the input file and load the contents into a python datastructure
with open('myfile.json') as input:
    data = json.load(input)

# iterate over each item
for item in data:
    # if "quantity" is not present, add it
    if 'quantity' not in item:
        item['quantity'] = 99.99

# write the updated data to a new file
with open('myfile_new.json', 'w') as output:
    json.dump(data, output)
  

Ответ №2:

 
jString = '''{
    "lst":[
    {
        "id": 9746439,
        "name": "Home Theater LG com blu-ray 3D, 5.1 canais e 1000W",
        "quantity": 80,
        "price": 2199.0,
        "category": "Eletrônicos"
     },
      {
        "id": 2162952,
        "name": "Kit Gamer acer - Notebook   Headset   Mouse",
        "price": 25599.0,
        "category": "Eletrônicos"
      }
    ]
    }'''
jObj = json.loads(jString)
for x in jObj["lst"]:
    if "quantity" not in x:
        x["quantity"] = 0
  

Вы можете просто назначить атрибут и сохранить его в файле или там, где он вам понадобится впоследствии.

Комментарии:

1. Я пробовал это: for case in broken_database: if case["quantity"] not in broken_database: case["quantity"] = 0 Но это выдает мне ошибку KeyError: 'quantity'

2. Вы не опубликовали полную структуру файла Json, поэтому я действительно не могу предложить больше деталей, кроме того, что я привел. Если вы получите KeyError , я предполагаю, что вы недостаточно глубоко проникли в узлы.

3. Мне удалось структурировать, следуя вашему совету и вышесказанному, в конце я рассматривал атрибут «товар» и «количество» как один, и это была ошибка

Ответ №3:

Я столкнулся с такой же головоломкой на днях и решил ее с помощью приведенного ниже кода. Я полностью согласен с тем, что это, вероятно, «ленивый» способ сделать это, но он очень прост для чтения.

 import json

json_string = '''{"results":[
{
    "id": 9746439,
    "name": "Home Theater LG com blu-ray 3D, 5.1 canais e 1000W",
    "quantity": 80,
    "price": 2199.0,
    "category": "Eletrônicos"
  },
  {
    "id": 2162952,
    "name": "Kit Gamer acer - Notebook   Headset   Mouse",
    "price": 25599.0,
    "category": "Eletrônicos"
  }]}'''

json_dict = json.loads(json_string)

for item in json_dict["results"]:
    try:
        item['quantity']
    except:
        item['quantity'] = 0
  

Подход, который я использовал здесь, заключается в том, чтобы попробовать и исключить, давайте попробуем и выберем ключ количества в ваших данных, и, эй, если его там нет, давайте просто добавим его.

Дайте мне знать, как вы используете этот подход.

Комментарии:

1. Я попробовал код, который разместил здесь @ John Gordon, и он сработал как по волшебству, я запущу этот и посмотрю, что получится, спасибо!!