我试图传递一个JSON文件,并将数据转换为字典。

到目前为止,这是我所做的:

import json
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)

我期望json1_data是字典类型,但它实际上是一个列表类型,当我检查它与类型(json1_data)。

我错过了什么?我需要它是一个字典,这样我就可以访问其中一个键。


当前回答

你可以使用以下方法:

import json

 with open('<yourFile>.json', 'r') as JSON:
       json_dict = json.load(JSON)

 # Now you can use it like dictionary
 # For example:

 print(json_dict["username"])

其他回答

我正在使用一个REST API的Python代码,所以这是为那些正在从事类似项目的人准备的。

我使用POST请求从URL中提取数据,原始输出是JSON。由于某种原因,输出已经是一个字典,而不是一个列表,我能够立即引用嵌套的字典键,如下所示:

datapoint_1 = json1_data['datapoints']['datapoint_1']

其中datapoint_1在数据点字典中。

加载JSON数据到字典的最好方法是你可以使用内置的JSON加载器。

下面是可以使用的示例代码片段。

import json
f = open("data.json")
data = json.load(f))
f.close()
type(data)
print(data[<keyFromTheJsonFile>])

你的JSON是一个数组,里面只有一个对象,所以当你读入它时,你会得到一个里面有字典的列表。你可以通过访问列表中的第0项来访问你的字典,如下所示:

json1_data = json.loads(json1_str)[0]

现在您可以访问存储在数据点中的数据,正如您所期望的那样:

datapoints = json1_data['datapoints']

我还有一个问题,如果有人能咬:我试图取这些数据点中第一个元素的平均值(即。点[0][0])。为了列出它们,我试着做数据点[0:5][0],但我得到的是带有两个元素的第一个数据点,而不是只想获得只包含第一个元素的前5个数据点。有办法做到这一点吗?

数据点[0:5][0]不会做你期望的事情。datpoints[0:5]返回一个只包含前5个元素的新列表片,然后在它的末尾添加[0]将只从结果列表片中获取第一个元素。你需要使用列表推导式来得到你想要的结果:

[p[0] for p in datapoints[0:5]]

这里有一个简单的方法来计算平均值:

sum(p[0] for p in datapoints[0:5])/5. # Result is 35.8

如果你愿意安装NumPy,那就更简单了:

import numpy
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)[0]
datapoints = numpy.array(json1_data['datapoints'])
avg = datapoints[0:5,0].mean()
# avg is now 35.8

对NumPy的数组使用带有切片语法的,操作符具有您最初对列表切片所期望的行为。

你可以使用以下方法:

import json

 with open('<yourFile>.json', 'r') as JSON:
       json_dict = json.load(JSON)

 # Now you can use it like dictionary
 # For example:

 print(json_dict["username"])

下面是一个简单的片段,从字典中读取json文本文件。请注意,您的json文件必须遵循json标准,因此它必须有“双引号而不是单引号”。

您的JSON dump.txt文件:

{"test":"1", "test2":123}

Python脚本:

import json
with open('/your/path/to/a/dict/dump.txt') as handle:
    dictdump = json.loads(handle.read())