Python:Json.load提供列表,无法从中解析数据

时间:2019-03-20 13:45:43

标签: python json python-3.x parsing

我有一个data.json文件,看起来像这样:

["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]

我正在尝试使用python从此文件中获取“事件”,但失败了。

with open('data.json', 'r') as json_file:
    data = json.load(json_file)
    print (data['Event'])

我收到以下错误:

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

即使我尝试

print (data[0]['Event'])

然后我收到此错误:

TypeError:字符串索引必须为整数

还有一件事:

print(type(data))

给我“列表”

我到处搜索,但没有找到解决方案。非常感谢您的建议。

3 个答案:

答案 0 :(得分:2)

您可以为此使用ast模块:

import ast

mydata = ["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]
data = ast.literal_eval(mydata[0])
data
{'Day': 'Today', 'Event': '1', 'Date': '2019-03-20'}

data['Event']
'1'

编辑

您的原始代码确实将数据加载到列表结构中,但是尽管使用了正确的json语法,但列表中仅包含一个字符串条目。 astjson一样,将把该字符串条目解析为python数据结构dict

就目前而言,当您尝试为该列表建立索引时,它与在字典中调用键是不同的,因此slices cannot be str

alist = [{'a':1, 'b':2, 'c':3}]
alist['a']
TypeError

# need to grab the dict entry from the list
adict = alist[0]
adict['a']
1

答案 1 :(得分:1)

您需要使用json模块将数据中的元素转换为dict。

例如:

import json

with open(filename) as infile:
    data = json.load(infile)
for d in data:
    print(json.loads(d)['Event'])

或:

data = list(map(json.loads, data))
print(data[0]["Event"])

输出:

1

答案 2 :(得分:1)

您的问题是您将其解析为包含单个元素(字符串)的列表。

["{\"Day\":\"Today\",\"Event\":\"1\", \"Date\":\"2019-03-20\"}"]

看看列表的整个内容如何在两边都被"包围,而每隔"前面都带有\?通常,斜杠表示忽略以下字符可能具有的特殊含义,而是将其解释为纯字符串。

如果您可以控制文件的内容,则最简单的解决方案是对其进行调整。您将希望它采用以下格式:

[{"Day":"Today", "Event": "1", "Date": "2019-03-20"}]

编辑:正如其他人所建议的那样,您也可以将其解析为当前状态。当然,清理数据很繁琐,但通常值得付出努力。尽管这可能不是其中一种情况。无论如何,我还是不回答这个问题,因为这可能有助于解释为什么OP最初的尝试不起作用,以及为什么他收到他收到的错误消息。