【问题标题】:need to access nested values in json.load需要访问 json.load 中的嵌套值
【发布时间】:2017-10-24 23:24:22
【问题描述】:

我正在使用 Hufman 的 Honeywell Python 代码从 MyTotalConnectComfort 网站提取数据。代码是here。我已经修改了 2.7 的代码。我也在使用 Flask。

当我调用 client.locations() 时,我会返回一个包含 6 个键的 json 文件。我削减了 json 中的数据,以获取我想要的单个键后面的数据,即“设备”。我使用以下代码来执行此操作:

Honeywelldata = client.locations()
newlist2 = []
dada = {}
for keyl, value in Honeywelldata[0].items():
    if keyl == "Devices":
        dada[keyl] = value
        print "dadakey", dada[keyl]
newlist2.append(dada)
print "newlist2 keys", newlist2[0].keys()
print "newlist2", json.dumps(newlist2, sort_keys=True,indent=4,separators=(',', ': '))

我在这个帖子的底部取回了数据和格式化列表。我试图能够将此 json 传递给 html,然后使用以下 html 代码从该列表中发布值。我已经尝试了很多事情,但我无法获得“设备”的子值。

{{ honeywell.Devices.ThermostatData.Outdoorhumidity | safe }}

我不断收到此错误UndefinedError: 'list object' has no attribute 'Devices'

我是否需要重新键入此列表,或者除了作为新手之外,我做错了什么。谢谢。

这是 newlist2 键和数据(jsonlint.com 将其显示为有效的 json)

newlist2 keys [u'Devices']
[{
"Devices": [{
    "AlertSettings": null,
    "DehumidifierData": null,
    "DemandResponseData": null,
    "DeviceID": 1111111,
    "DeviceType": 48,
    "FanData": null,
    "HasAlertSettings": false,
    "HasDehumidifier": false,
    "HasFan": false,
    "HasHumidifier": false,
    "HasUIData": true,
    "HoldUntilCapable": true,
    "HumidifierData": null,
    "IsAlive": true,
    "IsUpgrading": false,
    "LocationID": 1111111,
    "MacID": "000000000000",
    "Name": "THERMOSTAT",
    "Schedule": null,
    "ScheduleCapable": true,
    "ThermostatData": {
        "AllowedModes": [
            3,
            1,
            2
        ],
        "CoolRate": null,
        "CoolSetpoint": null,
        "Deadband": 0.0,
        "DisplayUnits": 1,
        "EquipmentOutputStatus": null,
        "HeatRate": null,
        "HeatSetpoint": null,
        "IndoorHumidity": 39.0,
        "IndoorHumidityStatus": 0,
        "IndoorTemperature": 74.0,
        "IndoorTemperatureStatus": 0,
        "IsCommercial": false,
        "IsInVacationHoldMode": false,
        "MaxCoolSetpoint": 99.0,
        "MaxHeatSetpoint": 90.0,
        "MinCoolSetpoint": 50.0,
        "MinHeatSetpoint": 40.0,
        "Mode": null,
        "NextTime": null,
        "OutdoorHumidity": 13.0,
        "OutdoorHumidityAvailable": true,
        "OutdoorHumidityStatus": 0,
        "OutdoorTemperature": 103.0,
        "OutdoorTemperatureAvailable": true,
        "OutdoorTemperatureStatus": 0,
        "ScheduleCoolSp": 75.0,
        "ScheduleHeatSp": 62.0,
        "Status": null,
        "VacationHold": null,
        "VacationHoldCancelable": true
    }
}]

}]

【问题讨论】:

  • 如果它是一个列表,那么您不应该使用属性...您应该使用索引...
  • 我只知道 - 为什么投反对票?

标签: python json flask honeywell


【解决方案1】:

在下面的表达式中(我假设它是一个 Django 模板片段和-或 Jinja2 表达式:

{{ honeywell.Devices.ThermostatData.Outdoorhumidity | safe }}

变量honeywell 似乎是list。你可以试试:

{{ honeywell[0].Devices[0].ThermostatData.Outdoorhumidity | safe }}

获取此列表的第一个元素。

【讨论】:

  • 感谢 Laurent - 我试过了,但我收到以下错误 UndefinedError: 'list object' has no attribute 'ThermostatData'。
  • 读取您的 JSON 对象,您会发现 Devices 也是一个列表。使用Devices[0](或循环)。查看我的编辑。
【解决方案2】:

{{ honeywell.Devices.ThermostatData.Outdoorhumidity | safe }}

霍尼韦尔是list 类型。确保您指的是正确的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2013-09-29
    相关资源
    最近更新 更多