Хранение данных из вложенных данных JSON в Python - PullRequest
0 голосов
/ 21 июня 2019

Я хочу получить доступ к значениям 'dl_dst' из всех наборов в этих данных json Я могу получить данные dl_dst, но он хранит 3 раза каждой точки данных спина к спине. Какую ошибку я совершил?

{'1': [{'actions': ['OUTPUT:1'],
    'byte_count': 238,
    'cookie': 0,
    'duration_nsec': 833000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:01',
              'dl_src': '00:00:00:00:00:02',
              'in_port': 2},
    'packet_count': 3,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:2'],
    'byte_count': 140,
    'cookie': 0,
    'duration_nsec': 828000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:02',
              'dl_src': '00:00:00:00:00:01',
              'in_port': 1},
    'packet_count': 2,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:1'],
    'byte_count': 238,
    'cookie': 0,
    'duration_nsec': 809000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:01',
              'dl_src': '00:00:00:00:00:03',
              'in_port': 2},
    'packet_count': 3,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:2'],
    'byte_count': 140,
    'cookie': 0,
    'duration_nsec': 807000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:03',
              'dl_src': '00:00:00:00:00:01',
              'in_port': 1},
    'packet_count': 2,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:1'],
    'byte_count': 238,
    'cookie': 0,
    'duration_nsec': 787000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:01',
              'dl_src': '00:00:00:00:00:04',
              'in_port': 2},
    'packet_count': 3,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:2'],
    'byte_count': 140,
    'cookie': 0,
    'duration_nsec': 786000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:04',
              'dl_src': '00:00:00:00:00:01',
              'in_port': 1},
    'packet_count': 2,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:CONTROLLER'],
    'byte_count': 1944,
    'cookie': 0,
    'duration_nsec': 582000000,
    'duration_sec': 168,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 80,
    'match': {},
    'packet_count': 27,
    'priority': 0,
    'table_id': 0}]}

Вот код Python, который я написал

import requests
import pprint
import json


url = 'https://api.myjson.com/bins/19yp59'
get_data = requests.get(url)
get_data_json = get_data.json()
data = get_data_json['1']

Dest_Mac = []

for k in data:

 for i in k['match']:
     Dest_Mac.append(k['match']['dl_dst'])


print(Dest_Mac)

Это результаты для этого кода

['00: 00: 00: 00: 00: 01', '00: 00: 00: 00: 00: 01 ', '00: 00: 00: 00: 00: 01', '00: 00 : 00: 00: 00: 02 ', '00: 00: 00: 00: 00: 02', '00: 00: 00: 00: 00: 02 ', '00: 00: 00: 00: 00: 01 ', '00: 00: 00: 00: 00: 01', '00: 00: 00: 00: 00: 01 ', '00: 00: 00: 00: 00: 03', '00: 00: 00 : 00: 00: 03 ', '00: 00: 00: 00: 00: 03', '00: 00: 00: 00: 00: 01 ', '00: 00: 00: 00: 00: 01', '00: 00: 00: 00: 00: 01 ', '00: 00: 00: 00: 00: 04', '00: 00: 00: 00: 00: 04 ', '00: 00: 00: 00 : 00: 04' ]

Обратите внимание, что каждая точка данных печатается 3 раза.

Ответы [ 4 ]

0 голосов
/ 21 июня 2019

Попробуйте,

>>> data_json = {'1': [{'actions': ['OUTPUT:1'],
    'byte_count': 238,
    'cookie': 0,
    'duration_nsec': 833000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:01',
              'dl_src': '00:00:00:00:00:02',
              'in_port': 2},
    'packet_count': 3,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:2'],
    'byte_count': 140,
    'cookie': 0,
    'duration_nsec': 828000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:02',
              'dl_src': '00:00:00:00:00:01',
              'in_port': 1},
    'packet_count': 2,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:1'],
    'byte_count': 238,
    'cookie': 0,
    'duration_nsec': 809000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:01',
              'dl_src': '00:00:00:00:00:03',
              'in_port': 2},
    'packet_count': 3,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:2'],
    'byte_count': 140,
    'cookie': 0,
    'duration_nsec': 807000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:03',
              'dl_src': '00:00:00:00:00:01',
              'in_port': 1},
    'packet_count': 2,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:1'],
    'byte_count': 238,
    'cookie': 0,
    'duration_nsec': 787000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:01',
              'dl_src': '00:00:00:00:00:04',
              'in_port': 2},
    'packet_count': 3,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:2'],
    'byte_count': 140,
    'cookie': 0,
    'duration_nsec': 786000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:04',
              'dl_src': '00:00:00:00:00:01',
              'in_port': 1},
    'packet_count': 2,
    'priority': 1,
    'table_id': 0},
   {'actions': ['OUTPUT:CONTROLLER'],
    'byte_count': 1944,
    'cookie': 0,
    'duration_nsec': 582000000,
    'duration_sec': 168,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 80,
    'match': {},
    'packet_count': 27,
    'priority': 0,
    'table_id': 0}]}

Вывод:

>>> out = []
>>> data = data_json[1]
>>> for d in data:
    for k,v in d.items():
        if k == 'match':
            for ik,iv in v.items():
                if ik == 'dl_dst':
                    out.append(iv)

с использованием списка:

>>> [iv for d in data for k,v in d.items() if k=='match' for ik,iv in v.items() if ik == 'dl_dst']
['00:00:00:00:00:01', '00:00:00:00:00:02', '00:00:00:00:00:01', '00:00:00:00:00:03', '00:00:00:00:00:01', '00:00:00:00:00:04']
0 голосов
/ 21 июня 2019

Измените цикл for следующим образом:

for k in data:
    for i,j in k['match'].items():
        if i == "dl_dst":
            Dest_Mac.append(j)

print(Dest_Mac)

Выход:

['00:00:00:00:00:01', '00:00:00:00:00:02', '00:00:00:00:00:01', '00:00:00:00:00:03', '00:00:00:00:00:01', '00:00:00:00:00:04']

Проблема в вашем внутреннем цикле. Он печатает значение dl_dst каждый раз, когда находит новый ключ.

Надеюсь, это ответит на ваш вопрос !!!

0 голосов
/ 21 июня 2019

Выполняя следующее:

for i in k['match']:
    Dest_Mac.append(k['match']['dl_dst'])

вы выполняете итерацию всех ключей, присутствующих в k['match'], и, следовательно, каждый раз добавляете k['match']['dl_dst'].В вашем примере это утроит желаемый результат.

Вы должны заменить на:

if 'dl_dst' in k['match'].keys():
        Dest_Mac.append(k['match']['dl_dst'])

Выход

['00:00:00:00:00:01', '00:00:00:00:00:02', '00:00:00:00:00:01', '00:00:00:00:00:03', '00:00:00:00:00:01', '00:00:00:00:00:04']
0 голосов
/ 21 июня 2019

Добро пожаловать в Stackoverflow!

Ваш внутренний цикл перебирает ключи в каждом словаре match, но он печатает значение, связанное с ключом dl_dts, каждый раз, когда находит новый ключ - отсюда три повторения каждого значения.

Нет необходимости итерировать вообще: у вас уже есть dict, поэтому все, что вам нужно сделать, это распечатать значение этого ключа - при условии, что оно существует.

Поэтому этот код использует метод dict get для возврата None, когда ключ отсутствует и нечего добавить в список.

data = {'1': [{'actions': ['OUTPUT:1'],
    'byte_count': 238,
    'cookie': 0,
    'duration_nsec': 833000000,
    'duration_sec': 138,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 104,
    'match': {'dl_dst': '00:00:00:00:00:01',
              'dl_src': '00:00:00:00:00:02',
              'in_port': 2},
    'packet_count': 3,
    'priority': 1,
    'table_id': 0},
# remainder of data omitted for brevity ...
   {'actions': ['OUTPUT:CONTROLLER'],
    'byte_count': 1944,
    'cookie': 0,
    'duration_nsec': 582000000,
    'duration_sec': 168,
    'flags': 0,
    'hard_timeout': 0,
    'idle_timeout': 0,
    'length': 80,
    'match': {},
    'packet_count': 27,
    'priority': 0,
    'table_id': 0}]}

result = []
for item in data['1']:
    this = item['match'].get('dl_dst')
    if this:
        result.append(this)

print(result)

Это, кажется, дает желаемый результат:

['00:00:00:00:00:01', '00:00:00:00:00:02', '00:00:00:00:00:01', '00:00:00:00:00:03', '00:00:00:00:00:01', '00:00:00:00:00:04']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...