使用Python访问JSON对象中包含的列表

时间:2018-03-04 19:35:36

标签: python json

testVar = {
  "date": 1520053431,
  "location": {
  "lat": 39.349887,
  "lng": -82.116147
  },
  "items": [
    {
      "macAddress": "98:90:96:9C:94:6C",
      "manufacturer": "intel"
    },
    {
  "macAddress": "98:90:96:9C:94:52",
  "manufacturer": "intel"
    },
    {
      "macAddress": "98:90:96:90:94:52",
      "manufacturer": "intel"
    }
  ]
}

print(testVar.items[0])

我有这个JSON对象,我正在尝试访问项目列表,但这会产生错误:

TypeError: 'builtin_function_or_method' object is not subscriptable

我尝试用json.loads和json.dumps解析它,但这些都没有。

6 个答案:

答案 0 :(得分:11)

首先让我举一个非常简单的例子,因为这对我们以后会非常有用。想象一下,我有这个简单的功能:

def myFunc():
    return [1,2,3]

问题:myFunc的第一个要素是什么?换句话说,myFunc[0]是什么。小心,我不是问它输出的第一个元素,即myFunc()[0];我的问题是myFunc本身的第一个要素!前者是[1,2,3]的第一个元素,即1;但是后者会给我一个TypeError,因为函数不能下标;类似于配方可以生产美味食物的事实,但你不能吃配方本身。

让我们来看看您的错误消息:

TypeError: 'builtin_function_or_method' object is not subscriptable

这意味着你以某种方式试图下标'builtin_function_or_method'对象。让我们看看你的代码并理解这个错误的原因。幸运的是,您的通话只是一行,因此易于调试:

testVar.items[0]

您正在做的是到达items的{​​{1}}函数或方法的第一个元素。要小心,不是结果的第一要素,而是功能本身。我怎么这么肯定?因为你忘记了括号,所以甚至还没有调用函数,即你没有dict

让我们仔细看看testVar.items()[0] s的内置items函数。当我们运行dict时,这是我们得到的响应:testVar.items。让我们运行以下内容来获取有关其文档字符串的一些帮助:<function items>,它返回以下内容:

?testVar.items

A-公顷!我们刚刚看到了我们提到的错误消息:Docstring: D.items() -> list of D's (key, value) pairs, as 2-tuples Type: builtin_function_or_method !因此,错误实际上是由于您的代码无法正确调用函数,而是尝试获取函数本身的第一个元素。

让我举一个更简单但同等的例子。说,我有一个列表builtin_function_or_method,我想找到它的最小元素。我可以使用x = [2, 3, 1]的内置函数,然后获取排序列表中的第一个元素。因此正确的语法是sort但是如果我忘记x.sort()[0],并写(),我将尝试获取第一个元素而不是x.sort[0]函数的结果(因为我甚至没有调用它来获得结果!)但是函数本身的第一个元素。还记得食谱不可食用吗?同样的事情。

总结:函数可以返回一个可以下标的迭代,但函数本身不是可订阅的。

让我们一点点玩这个功能吧。让我们按照文档字符串迭代它(键,值)对:

sort

这是有道理的,因为我们确实有3个键和相应的3个值。

现在,如何获取与名为for k, v in testVar.items(): print k, v # Result: date 1520053431 items [{'macAddress': '98:90:96:9C:94:6C', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:9C:94:52', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:90:94:52', 'manufacturer': 'intel'}] location {'lat': 39.349887, 'lng': -82.116147} 的键对应的值?请注意,这是您的三个键之一,但与我们上面讨论的items的内置函数具有相同的名称。这就是你的困惑所在。

错误消息是由dict函数引起的,让我们讨论如何获取与名为items的键对应的值。一种低效的方法是使用我上面提到的循环语法:

items

你走了,这是你的for k, v in testVar.items(): if k == 'items': print v # Result: [{'macAddress': '98:90:96:9C:94:6C', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:9C:94:52', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:90:94:52', 'manufacturer': 'intel'}] !执行相同操作的第二种有效方法是调用键名,值将返回给我们:

items

总结:

  1. 请注意testVar['items'] # Result: [{'macAddress': '98:90:96:9C:94:6C', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:9C:94:52', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:90:94:52', 'manufacturer': 'intel'}] 中的key与内置函数或方法具有相同名称的情况。
  2. 您不能dict,而是myDict.key
  3. 您还可以将myDict['key']的{​​{1}}函数作为item对循环,并获取与该键对应的值。但是不要这样做,与dict的恒定时间复杂度相比,这是低效的。
  4. 如果您致电(key, value),请务必确保myDict['key']实际执行该功能。也就是说,不要吃配方,而要吃它产生的食物。

答案 1 :(得分:2)

因为它有大括号({...}),所以它存储在dict(离心)中。这意味着您无法使用点运算符(.)来访问内部数据。

由于它是dict,您也无法像list一样访问它。相反,您需要使用可用的键(冒号前的字符串)。

在这种情况下,您需要执行textVar['items']之类的操作才能访问'items' list

答案 2 :(得分:2)

testVar是一个字典,Python中的字典具有 items()方法。例如,为了访问此词典中的所有键/值对,您可以根据Python docs使用。请注意下面的items()方法。

for key, value in testVar.items():
      print(key, value)

正如@FatihAkici所指出的,语句testVar.items()[0]在语法上是不正确的,因为你试图调用不支持索引的items()方法。这意味着您无法通过索引位置访问对象中的项目,就像我们在列表中一样:

按索引位置访问列表:

music = ['Beatles', 'Led Zeppelin', 'The Doors']
#item at index 0:
music[0]   #Beatles

同时,您可以看到对象testVar.items()的类型为dict_items,只能通过键/值访问。

testVar.items()[0]
TypeError: 'dict_items' object does not support indexing

#Output: dict_items([('date', 1520053431), ('location', {'lat': 39.349887, 'lng': -82.116147}), ('items', [{'macAddress': '98:90:96:9C:94:6C', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:9C:94:52', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:90:94:52', 'manufacturer': 'intel'}])])

print(testVar.items())   

要访问items列表,您可以使用列表推导。这是一种使用较少代码访问所有项目的紧凑方式:

test = [print(key, value) in testVar for key,value in testVar.items() if key=="items"]

#test: items [{'macAddress': '98:90:96:9C:94:6C', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:9C:94:52', 'manufacturer': 'intel'}, {'macAddress': '98:90:96:90:94:52', 'manufacturer': 'intel'}]

答案 3 :(得分:1)

问题在于print语句。 JSON 与字典相同。 所以要访问字典中的任何元素,我们使用 dictionary_name [key]

因此,以下代码可以正常工作:

(更改代码中的print语句如下)

print(testVar['items'][0])

答案 4 :(得分:0)

您可以通过执行以下操作来访问所需变量:

print(testVar["items"][0])

因为&#34; testVar&#34;和&#34;项目&#34;是字典变量。

答案 5 :(得分:-1)

而不是:

  

print(testVar['items'][0])

我会更进一步做:

print(testVar.get('items', None)[0])

OR

items = testVar.get('items', None) if items: print(items[0])

.get('key)可帮助您避免在尝试从KeyError

获取值时出现testVar错误