Python:TypeError在JSON提要中引用项

Python:TypeError在JSON提要中引用项,python,json,Python,Json,首先,这里是一个示例JSON提要,我想在Python2.7中使用simplejson或内置JSON解码器阅读它。我正在用Python加载.json文件,然后搜索像“Apple”或“Orange”这样的键,当找到该键时,我想输入它的信息,比如类型和数量 现在只有3个项目,但我想能够搜索一个可能有多达1000个项目。代码如下: { “水果”:[ { “苹果”:[ { “类型”:“Gala”, “数量”:5 }, { “类型”:“Honeycrisp”, “数量”:10 }, { “类型”:“红色美

首先,这里是一个示例JSON提要,我想在Python2.7中使用simplejson或内置JSON解码器阅读它。我正在用Python加载.json文件,然后搜索像“Apple”或“Orange”这样的键,当找到该键时,我想输入它的信息,比如类型和数量

现在只有3个项目,但我想能够搜索一个可能有多达1000个项目。代码如下:

{
“水果”:[
{
“苹果”:[
{
“类型”:“Gala”,
“数量”:5
},
{
“类型”:“Honeycrisp”,
“数量”:10
},
{
“类型”:“红色美味”,
“数量”:4
}
]
},
{
“香蕉”:[
{
“类型”:“车前草”,
“数量”:5
}
]
},
{
“橙色”:[
{
“类型”:“血液”,
“数量”:3
},
{
“类型”:“肚脐”,
“数量”:20
}
]
}
]
}

我的示例Python代码如下所示:


import simplejson as json

# Open file
fjson = open('/home/teg/projects/test/fruits.json', 'rb')
f = json.loads(fjson.read())
fjson.close()

# Search for fruit
if 'Orange' in json.dumps(f):

    fruit = f['fruits']['Orange']
    print(fruit)

else:

    print('Orange does not exist')

将simplejson导入为json
#打开文件
fjson=open('/home/teg/projects/test/fruits.json','rb')
f=json.load(fjson.read())
fjson.close()
#寻找水果
如果json.dumps(f)中的“橙色”:
水果=f[“水果”][“橙色”]
印刷品(水果)
其他:
打印('橙色不存在')

但每当我测试它时,它就会给我这个错误:
TypeError:列表索引必须是整数,而不是str

让我做一个json.dumps是错误的吗?相反,我应该按照标准json.loads检查json提要吗?我得到这个类型错误是因为我没有指定列表索引,但是如果我不知道那个水果的索引呢

我必须首先搜索一个水果,如果它在那里,得到索引,然后像这样在水果之前引用索引吗?
fruit=f['fruits'][2]['Orange']


如果是这样的话,如果找到了水果,我怎么才能得到它的索引,这样我就可以提取信息了?如果您认为JSON的格式也不正确,并且导致了这个问题,那么我也支持这个建议。我被困在这个问题上了,你们能提供的任何帮助都会很好。:-)

问题在于数据结构有一个包含字典的列表。如果您对数据源有任何控制权,那就是修复它的地方。否则,最好的方法可能是在解析数据后对其进行后处理,以消除这些额外的列表结构,并将每个列表中的词典合并到单个词典中。如果使用
OrderedDict
,您甚至可以保留项目的顺序(这可能是使用列表的原因)。

您的
f
类型是
list
,它是一个带有子词典的词典列表

如果json.dumps(f)中的'Orange':
将迭代列表并查看
Orange
的每个项目

问题是
f['fruits']
是一个
列表
,因此它需要一个
int
数字(位置) 而不是像
['Orange']

我认为你应该像@kindall所说的那样检查你的结构,如果你仍然想提取
橙色
,那么这个代码就可以了:

 for value in f['fruits']:
    if 'Orange' in value:
        print value['Orange']

“水果”行中的方括号:[
应该告诉您与
水果相关联的项目是(用Python的说法)一个
列表
而不是一个
目录
,因此不能直接用
'Oranges'
这样的字符串进行索引。听起来你想创建一个水果的
目录
。你可以通过重新格式化输入来实现这一点

或者,如果输入格式是固定的:您的
水果
列表中的每个项目当前都有一个非常特定的格式。每个项目都是一个只有一个键的
dict
,并且这些键在项目之间不会重复。如果可以依赖这些规则,那么编写一个小的搜索例程就相当容易了,或者下面的代码将转换为li把一段口述变成一段口述:

fruits = dict(sum([x.items() for x in f['fruits']], []))
print fruits['Orange']

这样,列表中可能有几个苹果,您将如何处理它们?感谢您的帮助Kobi。在我的代码中的if语句之前添加for语句有助于我循环数据。如果我遇到任何进一步的问题,我将更新线程。 fruit = f['fruits'][2]['Orange']
 for value in f['fruits']:
    if 'Orange' in value:
        print value['Orange']
fruits = dict(sum([x.items() for x in f['fruits']], []))
print fruits['Orange']