在Python中对JSON进行扁平化处理

本教程将讨论在Python中使用条件语句、循环和type() 函数对JSON进行扁平化。

在Python中扁平化JSON

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 Datan',data)

输出:

Original Data
 {'Ali': {'age': 18, 'profession': 'student'}, 'Ammar': {'age': 'nineteen', 'profession': 'mechanic'}}

我们必须在open() 函数中提供文件名和它的扩展名来读取它,如果该文件与Python文件不在同一目录下,我们必须在open() 函数里面提供该文件的完整路径以及它的名称和扩展名。我们使用json 库的load() 函数来读取JSON数据。

我们可以在数据变量中使用他的名字来获取单个人的数据,如data['Ali'] 。如果我们有一个包含大量数据的多级JSON文件,就很难读取特定属性的值。

在多级JSON文件内,我们在其他属性内有属性,如列表或dicts 。如果我们想把多级JSON文件转换为单级,我们可以组合属性名称。

例如,在上面的代码中,如果我们想得到Ali 的年龄,我们可以用data['Ali']['age'] 来访问它,但如果我们把属性名称结合起来,我们可以用data['Ali_age'] 来得到Ali 的年龄。

我们可以使用一个递归函数,它将多次调用自己来平铺JSON数据。我们必须从JSON文件中读取数据,并使用两个循环来检查数据中的listdict

我们将使用循环将属性的名称与分隔符结合起来,并将其值保存为dict 格式。当JSON文件中没有更多的数据时,循环将停止,结果将被返回。

例如,让我们把上面的JSON文件压扁。请看下面的代码。

import json
json_file = open('people.json')
data = json.load(json_file)
print('Original Datan',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 Datan',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 ,第一个循环将工作;如果来了一个列表,第二个循环将工作。

在上面的输出中,我们可以看到原始数据包含两个dicts ,但扁平化后的数据只包含一个dict 。这个例子的JSON文件不包含任何列表,但是上面的代码对包含列表的JSON文件也可以工作。

原始数据和扁平化数据有一个区别;我们可以使用原始数据同时获得一个人的年龄和职业,因为年龄和职业有相同的父属性,也就是这个人的名字,但是我们不能使用扁平化的数据做同样的事情。

为了使用扁平化数据获得一个人的年龄和职业,我们必须逐一单独获得它们。

当我们只需要得到一个单一的值时,扁平化的JSON文件是有用的,但如果我们想得到一个对象或属性的所有信息,我们可以使用原始JSON文件。请查看这个链接,了解关于JSON库的更多细节。