1

我收到了一个相当不舒服的 JSON 格式,如下所示:

[
{
    "attributes": [
        {
            "type": "COMMAND",
            "name": "COMMAND",
            "value": [
                "buttonState"
            ]
        },
        {
            "type": "std_msgs.msg.Bool",
            "name": "buttonState",
            "value": {
                "data": false
            }
        }
    ],
    "type": "sensor",
    "id": "s_2"
}]

而且我想比较一段数据(更准确地说 - 按钮状态的值),但我似乎失败了。尝试以下:

import requests
import json
yo = 1
switchPost = "http://192.168.0.104:7896/iot/d?k=123456789&i=san_1_switch&d=sw|{}"
robGet = "http://192.168.0.109:10100/robot/sen_2"

r = requests.get(robGet, headers={"content-type":"application/json"})
resp = json.loads(r.text)

for attrs in (resp['attributes']['value']):
    if attrs['data'] == false:
        yo = 100
        break
    
g = requests.post(switchPost.format(yo), headers={"content-type":"text/plain"})
print(r.text)

不幸的是,我收到的错误如下:

对于 (resp['attributes']['value']) 中的属性:

TypeError:列表索引必须是整数,而不是 str

4

3 回答 3

3

[在您的 JSON 中,它被包装的事实]意味着它是一个 JSON数组,但只有一个元素。

因此,正如您的错误消息所暗示的那样,resp需要一个整数作为它的索引,对于您想要的数组元素。resp[0]然后指

{
    "attributes": [
        {
            "type": "COMMAND",
            "name": "COMMAND",
            "value": [
                "buttonState"
            ]
        },
        {
            "type": "std_msgs.msg.Bool",
            "name": "buttonState",
            "value": {
                "data": false
            }
        }
    ],
    "type": "sensor",
    "id": "s_2"
}

(注意没有[],所以它是一个 JSON对象

然后你想resp[0]['attributes']引用这个对象的单个部分,'attributes'它再次引用一个数组。

因此for attribute in resp[0]['attributes']将允许您循环遍历此数组。

要获得所需的布尔值,您需要查找该数组的哪个元素具有'name''buttonState'检查相应的'value'.

总之,您可能正在寻找类似的东西:

for attribute in resp[0]['attributes']:
    if attribute['name'] == 'buttonState' and attribute['value']['data'] is False:
        # Do your thing here
于 2018-07-09T15:07:13.257 回答
2

resp是一个列表,因此,要获取第一个元素,请以 . 的形式访问它resp[0]。与 resp[0]['attributes'] 相同

所以你可以按如下方式访问它

resp[0]['attributes'][0]['value']

您可以按如下方式重组您的 for 循环

for d in resp[0]['attributes']:
    if isinstance(d['value'], dict) and d['value'].get('data') == false:
        yo = 100
        break
于 2018-07-09T15:01:35.533 回答
1

答案在我认为的错误消息中:

TypeError:列表索引必须是整数,而不是 str

中的第一个条目是attributes一个value列表,因此您无法从中获取“数据”。由于您有多种类型,您可能需要检查“值”是列表还是字典。

编辑:我想在这里开枪了。@dennlinger 对您的错误消息进行了解释。但是一旦你过去了,你会再次得到它......

于 2018-07-09T15:00:20.620 回答