Условный анализ JSON и добавление

#python #json #if-statement #parsing

Вопрос:

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

 [
{
 "frame_id":1, 
 "filename":"bake/IMG_20210930_090024.jpg", 
 "objects": [ 
  {"class_id":0, "name":"brick", "relative_coordinates":{"left_x":1279, "top_y": 991, "width": 922, "height":1164},"relevant":true}
 ] 
}, 
{
 "frame_id":2, 
 "filename":"bake/IMG_20210930_090017.jpg", 
 "objects": [ 
  {"class_id":1, "name":"limestone", "relative_coordinates":{"left_x":1672, "top_y":1536, "width": 651, "height": 623},"relevant":true}
 ] 
}
] 

Мой код и результат:

 with open('/home/pan/output/result.json') as json_data:
data = json.load(json_data)
for item in data:
for row in item.get('objects', []):
print(row['class_id'], row['relative_coordinates']['width'],row['relative_coordinates']['height'])

0 922 1164
1 651 623       
 

Мой главный вопрос заключается в том, что я хотел бы показать результаты только для «class_id»:0 для ширины и высоты.
Кроме того, каков наилучший способ добавить эти значения через консоль или пустой массив[] и выполнить вычисления позже?

Ответ №1:

Вы можете попробовать это:

 value_list = []
with open('result.json') as json_data:
    data = json.load(json_data)
    for item in data:
        for row in item.get('objects', []):
            if row['class_id'] == 0:
                print(row['class_id'], row['relative_coordinates']['width'], row['relative_coordinates']['height'])
                value_list.append(row['relative_coordinates']['width'])
                value_list.append(row['relative_coordinates']['height'])

print(value_list)

 

Выход:

 0 922 1164
[922, 1164]
 

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

1. Лучше иметь for item in data отдельный цикл, чтобы нам не приходилось держать файл открытым после того, как мы получим из него данные.

2. Я просто стараюсь сохранить код таким, какой он есть, вот почему пишу так, иначе мы можем прочитать файл с помощью переменной и сделать все остальное с этой переменной. 🙂

Ответ №2:

Вы получаете доступ к своим данным, просматривая диктанты и списки один за другим.

 width = -1
height = -1
for item in data:
    if item['objects'][0]['class_id'] == 0:
        width = item['objects'][0]['relative_coordinates']['width']
        height ​= item['objects'][0]['relative_coordinates']['height']
        break
 

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

1. Это просто неправда. Я проверяю все пункты во внешнем списке.

Ответ №3:

Простое добавление if условия в ваш код даст ожидаемые результаты, как показано ниже:

 data = None
with open('/home/pan/output/result.json') as json_data:
    data = json.load(json_data)
co_ordinates = []
for item in data:
    for row in item.get('objects', []):
        if row['class_id'] == 0:
            co_ordinates.append(row['relative_coordinates']['width'])
            co_ordinates.append(row['relative_coordinates']['height'])
            break
            
print (co_ordinates)
 

Выход:

 [922, 1164]