如何使用Python

时间:2018-01-29 01:15:58

标签: python json search

Python新手需要一些帮助。

寻找从我的鹦鹉花盆到Domoticz的数据我找到了一个脚本,但是已经过时了。我设法得到了工作,但只有一个问题仍然存在...... :(

我有来自Parrot API的json响应,其中包含以下数据:

u 'locations': [{
        u 'first_sample_utc': u '2018-01-27T18:34:59Z',
        u 'air_temperature': {
            u 'status_key': u 'status_ok',
            u 'gauge_values': {
                u 'current_value': 16.2531360227017,
                u 'min_threshold': 7.0,
                u 'max_threshold': 35.0
            },
            u 'instruction_key': u 'air_temperature_good',
            u 'next_analysis_datetime_utc': None
        },
        u 'processing_uploads': False,
        u 'user_sharing': {
            u 'first_all_green': {
                u 'sharing_status': u 'conditions_unmet'
            }
        },
        u 'battery': {
            u 'gauge_values': {
                u 'current_value': 100,
                u 'min_threshold': 0,
                u 'max_threshold': 100
            }
        },
        u 'global_validity_datetime_utc': u '2018-01-31T00:19:56Z',
        u 'location_identifier': u 'kOzNaDnxWi1517078855393',
        u 'watering': {
            u 'status_key': u 'status_ok',
            u 'automatic_watering': {
                u 'next_watering_datetime_utc': u '2018-01-29T00:21:29Z',
                u 'instruction_key': u 'automatic_watering_good',
                u 'last_watering_datetime_utc': None,
                u 'done_action_datetime_utc': None,
                u 'status_key': u 'status_ok',
                u 'gauge_values': {
                    u 'current_value': 81,
                    u 'min_threshold': 0,
                    u 'max_threshold': 100
                },
                u 'full_autonomy_days': None,
                u 'predicted_action_datetime_utc': u '2018-01-29T00:21:30Z'
            },
            u 'instruction_key': u 'automatic_watering_good',
            u 'soil_moisture': {
                u 'status_key': u 'status_ok',
                u 'gauge_values': {
                    u 'current_value': 64.8775787353516,
                    u 'min_threshold': 32.0,
                    u 'max_threshold': None
                },
                u 'instruction_key': u 'soil_moisture_good',
                u 'predicted_action_vwc_value': None,
                u 'predicted_action_datetime_utc': None
            }
        },
        u 'last_sample_utc': u '2018-01-29T00:19:56Z',
        u 'growth_day': False,
        u 'total_sample_count': 120,
        u 'light': {
            u 'status_key': u 'status_ok',
            u 'gauge_values': {
                u 'current_value': 0.00263333333333334,
                u 'min_threshold': 5.0,
                u 'max_threshold': 99.0
            },
            u 'instruction_key': u 'light_too_low',
            u 'next_analysis_datetime_utc': None
        },

从json搜索和解析数据到Domoticz的代码:

for loc in status_locations:
plante=('{plant}:'.format(plant=loc2name[loc['location_identifier']].encode('utf-8')))
print plante
if plante == Nom_Plante:
    print('Found Plant')
    for metric in ['light', 'soil_moisture']:
        data = loc[metric]
        if debug!=0:
            print ('############# metrics###############')
            print('  {metric}:'.format(metric=metric))
            #print('    instruction_key: {0}'.format(data['instruction_key']))
            print('#####################################')
        inst_key=format(data['instruction_key'])
        status_key=format(data['status_key'])


        if metric == 'light':
            domoticz_idx=str(periph_idx['Plante_Lumiere_Status'])
            maj_widget_alert(domoticz_idx,status_key,inst_key,battery_level)   

            z=data['gauge_values']
            # Conversion de la valeur en Lux (1 PAR = 53.93 Lux) 
            valeur=z['current_value']*53.93
            valeur="%.2f" % valeur
            domoticz_idx=str(periph_idx['Plante_Lumiere_Valeur'])
            maj_widget_texte(domoticz_idx,valeur,battery_level)

        if metric == 'soil_moisture':
            domoticz_idx=str(periph_idx['Plante_Humidite_Status'])
            maj_widget_alert(domoticz_idx,status_key,inst_key,battery_level)

            z=data['gauge_values']
            valeur="%.2f" % z['current_value']
            domoticz_idx=str(periph_idx['Plante_Humidite_Valeur'])
            maj_widget_texte(domoticz_idx,valeur,battery_level)

搜索“light”下的数据有效,但搜索“soil_moisture”却没有。我可以看到它与'soil_moisture'在'浇水'的子项下的原因有关。但是,我怎样才能在这个脚本中搜索“soil_moisture”,就像“光”数据一样?

任何帮助都会很好......

2 个答案:

答案 0 :(得分:0)

soil_moisture对象是watering对象的数据成员,而light是顶级对象。

soil_moisture对象需要通过watering访问,如下所示:loc['watering']['soil_moisture']

答案 1 :(得分:0)

您可以更改度量标准列表以保留对象路径,而不仅仅是第一级的键。

示例:

更改

for metric in ['light', 'soil_moisture']:
        data = loc[metric]

for metric in [loc['light'], loc["watering"]['soil_moisture']]:
        print metric