в Python 3, как я могу нарезать данные JSON, где все объекты начинаются с одинакового имени? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть строка JSON, которая возвращает информацию об устройстве, и если устройства будут найдены, устройства будут перечислены как device0, device1, device2, et c. В этом простом коде ниже, как я могу обнаружить все устройства, найденные в JSON, а затем распечатать информацию ниже для каждого устройства? В настоящее время я статически просматриваю каждое устройство и хочу, чтобы это обнаружение было динамическим c, и печатаю результаты для каждого найденного.

r1 = requests.get(url = url_api, params = PARAMS)

devicedata = r1.json()

if 'device0' in devicedata:
        print('')
        device0Name = (devicedata['device0']['device_name'])
        print(device0Name)
        print('Temp: {}'.format (devicedata['device0']['obs'][0]['ambient_temp']))
        print('Probe Temp: {}'.format (devicedata['device0']['obs'][0]['probe_temp']))
        print('Humidity: {}%'.format (devicedata['device0']['obs'][0]['humidity']))
        print('')

# JSON информация выглядит следующим образом ...

{'device0': {'success': True, 'device_type': 'TX60', 'obs': [{'device_id': '1111', 'device_type': 'TX60', 'u_timestamp': '1580361017', 'ambient_temp': '45.7', 'probe_temp': '45.5', 'humidity': '82', 'linkquality': '100', 'lowbattery': '0', 'success': '9', 's_interval': '99', 'timestamp': '1/29/2020 11:10 PM', 'utctime': 1580361017}], 'alerts': {'miss': {'id': '520831', 'alert_type': 'miss', 's_id': '1111', 'max': '-100', 'min': '30', 'wet': '0', 'alert_id': '1', 'phone': 'yes', 'email': '', 'state': None}, 'batt': {'id': '520832', 'alert_type': 'batt', 's_id': '1111', 'max': '-100', 'min': '-100', 'wet': '0', 'alert_id': '1', 'phone': 'yes', 'email': '', 'state': None}}, 'ispws': 0, 'unit': {'temp': '°F', 'temp2': '°F', 'rh': '%'}, 'device_id': '1111', 'expired': '0', 'interval': '30', 'reg_date': '2020-01-17 22:06:48', 'create_date': 1579298808, 'device_name': 'Back Yard', 'assocGateway': '1', 'problem': False}, 'device1': {'success': True, 'device_type': 'TX60', 'obs': [{'device_id': '2222', 'device_type': 'TX60', 'u_timestamp': '1580360303', 'ambient_temp': '63.6', 'probe_temp': 'N/C', 'humidity': '64', 'linkquality': '100', 'lowbattery': '0', 'success': '9', 's_interval': '99', 'timestamp': '1/29/2020 10:58 PM', 'utctime': 1580360303}], 'alerts': {'miss': {'id': '520220', 'alert_type': 'miss', 's_id': '2222', 'max': '-100', 'min': '30', 'wet': '0', 'alert_id': '1', 'phone': 'yes', 'email': '', 'state': None}, 'batt': {'id': '520221', 'alert_type': 'batt', 's_id': '2222', 'max': '-100', 'min': '-100', 'wet': '0', 'alert_id': '1', 'phone': 'yes', 'email': '', 'state': None}}, 'ispws': 0, 'unit': {'temp': '°F', 'temp2': '°F', 'rh': '%'}, 'device_id': '3333', 'expired': '1', 'interval': '30', 'reg_date': '2016-03-19 01:45:04', 'create_date': 1500868369, 'device_name': 'Crawl Space', 'assocGateway': '1', 'problem': False}, 'device2': {'success': True, 'device_type': 'TX60', 'obs': [{'device_id': '3333', 'device_type': 'TX60', 'u_timestamp': '1580360195', 'ambient_temp': '70.2', 'probe_temp': 'N/C', 'humidity': '48', 'linkquality': '100', 'lowbattery': '0', 'success': '9', 's_interval': '99', 'timestamp': '1/29/2020 10:56 PM', 'utctime': 1580360195}], 'alerts': None, 'ispws': 0, 'unit': {'temp': '°F', 'temp2': '°F', 'rh': '%'}, 'device_id': '3333', 'expired': '0', 'interval': '15', 'reg_date': '2020-01-30 04:34:00', 'create_date': 1580358840, 'device_name': 'Basement', 'assocGateway': '2', 'problem': False}, 'tz': 'America/Chicago'}

Выход для одного устройства выглядит следующим образом ..

Back Yard
Temp: 50.9
Probe Temp: 51.2
Humidity: 92%


Crawl Space
Temp: 65.4
Probe Temp: N/C
Humidity: 55%


Basement
Temp: 70
Probe Temp: N/C
Humidity: 48%

1 Ответ

0 голосов
/ 10 февраля 2020

Нашли.

for devKey in devicedata.keys():
    if "device" in devKey:
        dev = devicedata[devKey]
        name = dev["device_name"]
        obs = dev["obs"][0]
        temp = obs["ambient_temp"]
        probeTemp = obs["probe_temp"]
        humidity = obs["humidity"]
        print(name)
        print('Temp: {}'.format(temp))
        print('Probe Temp: {}'.format(probeTemp))
        print('Humidity: {}%'.format(humidity))
        print('') 
...