JSON 是一种文件格式,它代表 JavaScript Object Notation。 JSON 存储和传输人类可以阅读和理解的数据。
我们在 JSON 文件中看到不同的属性,其值由数组或列表分隔。 例如,我们可以使用 JSON 文件来存储学生的姓名、年龄、地址和班级等数据。
每个学生的数据将存储在一个包含不同数据类型的属性和值的数组中。 例如,下面给出了一个示例 JSON 文件。
{
"Ali"
:
{
"age"
:
18
,
"profession"
:
"student"
}
,
"Ammar"
:
{
"age"
:
"nineteen"
,
"profession"
:
"mechanic"
}
上面的文件包含两个人的信息,我们可以使用Python的json库读取。 例如,使用json库读取上面的文件并显示其内容。
请参阅下面的代码。
import
json
json_file =
open
(
'people.json'
)
data = json.load(json_file)
print
(
'Original Data\n'
,data)
Original Data
{
'Ali'
: {
'age'
: 18,
'profession'
:
'student'
},
'Ammar'
: {
'age'
:
'nineteen'
,
'profession'
:
'mechanic'
}}
我们必须在
open()
函数中提供文件名及其扩展名才能读取它,如果文件与 Python 文件不在同一目录中,我们必须提供文件的完整路径及其名称和 open() 函数中的扩展。 我们使用 json 库的 load() 函数来读取 JSON 数据。
我们可以在数据变量中使用他的名字来获取一个人的数据,如
data['Ali']
。 如果我们有一个包含大量数据的多级 JSON 文件,就很难读取特定属性的值。
在多级 JSON 文件中,我们在其他属性(如列表或字典)中有属性。 如果我们想将多级 JSON 文件转换为单级,我们可以组合属性名称。
例如,在上面的代码中,如果我们想获取Ali的年龄,我们可以使用
data['Ali']['age']
来访问它,但是如果我们结合属性名,我们可以使用
data['Ali_age ']
得到
Ali_age
。
我们可以使用一个会多次调用自身的递归函数来展平 JSON 数据。 我们必须从 JSON 文件中读取数据,并使用两个循环来检查数据中的列表和字典。
我们将使用循环将属性的名称与分隔符组合起来,并将其值以字典格式保存。 当 JSON 文件中没有更多数据时,循环将停止,并返回结果。
例如,让我们展平上面的 JSON 文件。 请参阅下面的代码。
import
json
json_file =
open
(
'people.json'
)
data = json.load(json_file)
print
(
'Original Data\n'
,data)
def
flatten_json_data
(
json_data
):
out = {}
def
flatten_json
(
d, name=
''
):
if
type
(d)
is
dict
:
for
a
in
d:
flatten_json(d[a], name + a +
'_'
)
elif
type
(d)
is
list
:
i =
0
for
a
in
d:
flatten_json(a, name +
str
(i) +
'_'
)
i +=
1
else
:
out[name[:-
1
]] = d
flatten_json(json_data)
return
out
flattened_data = flatten_json_data(data)
print
(
'\nflatten Data\n'
,flattened_data)
Original Data
{
'Ali'
: {
'age'
: 18,
'profession'
:
'student'
},
'Ammar'
: {
'age'
:
'nineteen'
,
'profession'
:
'mechanic'
}}
flatten Data
{
'Ali_age'
: 18,
'Ali_profession'
:
'student'
,
'Ammar_age'
:
'nineteen'
,
'Ammar_profession'
:
'mechanic'
}
在上面的代码中,我们使用 if-else 条件语句来检查输入数据类型和 type() 函数,该函数返回对象的数据类型。 在读取数据时,如果有 dict 来,第一个循环将起作用; 如果出现列表,第二个循环将起作用。
在上面的输出中,我们可以看到原始数据包含两个字典,但扁平化后的数据只包含一个字典。 示例 JSON 文件不包含任何列表,但上面的代码也适用于包含列表的 JSON 文件。
原始数据和扁平化后的数据存在差异; 我们可以使用原始数据同时获取一个人的年龄和职业,因为年龄和职业具有相同的父属性,即人的姓名,但我们不能使用扁平化的数据。
扁平化后的数据要得到一个人的年龄和职业,我们得一个一个分开来。
当我们只需要获取单个值时,扁平化的 JSON 文件很有用,但如果我们想获取有关对象或属性的所有信息,我们可以使用原始 JSON 文件。
Python 错误 IsADirectoryError: [Errno 21] Is a directory 解决方法
在 Python 中对元组列表进行排序
Python 错误 UnicodeDecodeError: 'utf-8' codec can't decode invalid continuation byte
Python从列表中随机选择N个元素
Python NameError: function is not defined 错误
Python 中 TypeError: Class() takes no arguments 错
Python 中 JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2
Python 打印不带括号的元组
如何使用 Python 创建目录的 Zip 存档