【问题标题】:Comparing value in a JSON using Python使用 Python 比较 JSON 中的值
【发布时间】:2018-12-17 07:25:28
【问题描述】:

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

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

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

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

【问题讨论】:

  • 请注意attributes 中的值是如何另外包装在列表中的;只需使用额外的[0] 访问它就可以了,即resp['attributes'][0]['value']
  • 请注意,外部元素也可能需要这样做,因为还有一个全局列表包装器。
  • @dennlinger 谢谢,下次我会考虑以下几点!

标签: python json api parsing python-requests


【解决方案1】:

在您的 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'] 将允许您循环访问此数组。

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

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

for attribute in resp[0]['attributes']:
    if attribute['name'] == 'buttonState' and attribute['value']['data'] is False:
        # Do your thing here

【讨论】:

  • 所以它最初是一个数组,这就是为什么它需要一个索引来引用。谢谢!
【解决方案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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2020-12-28
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多