首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Python在JSON响应下搜索子键

如何使用Python在JSON响应下搜索子键
EN

Stack Overflow用户
提问于 2018-01-29 01:15:58
回答 2查看 392关注 0票数 0

Python新手需要帮助。

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

我有一个来自鹦鹉API的json响应,其数据如下:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
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‘的工作在这个脚本中像’光明‘的数据?

任何帮助都很好..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-29 07:28:40

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

示例:

Change

代码语言:javascript
复制
for metric in ['light', 'soil_moisture']:
        data = loc[metric]

代码语言:javascript
复制
for metric in [loc['light'], loc["watering"]['soil_moisture']]:
        print metric
票数 0
EN

Stack Overflow用户

发布于 2018-01-29 02:13:26

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48493135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档