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解析它,但这些都没有。
答案 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
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
与内置函数或方法具有相同名称的情况。dict
,而是myDict.key
。myDict['key']
的{{1}}函数作为item
对循环,并获取与该键对应的值。但是不要这样做,与dict
的恒定时间复杂度相比,这是低效的。(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
错误