技术文章

如何在Python中使用JSON数据

在本文中,我们将学习如何在Python中使用JSON数据。JSON代表JavaScript Object Notation,它是一种流行的基于文本的数据格式。
尽管JSON是从JS派生的,但它已经独立于语言一段时间了。
因此,任何编程语言都可以使用它。它用于存储和交换数据。
例如,从API提取数据或在某些文档数据库中使用数据时,数据大多采用JSON格式。让我们举个例子。 
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
{
"name":"Ashton",
"age":15,
"grade":8,
"subjects":["math", "english", "science"],
}

如你所见,以上数据非常易读,看起来很像Python。数据项由键/值对组成,键/值对之间包含一个冒号(:)。此外,两个数据项之间用逗号(,)分隔。 

从入门开始,让我们开始,看看如何在Python中处理JSON数据。

Python具有对JSON的本地支持,并为此提供了内置模块json。在代码顶部添加以下行以开始使用JSON。

  •  
import json

首先,让我们看一下如何执行序列化,即编码JSON数据。

编码JSON数据(从Python到JSON)

将JSON写入文件

json模块提供dump()方法以将JSON数据写入文件。它带有两个必需的参数,一个要编码的Python对象和一个类似文件的实例。考虑以下示例。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import json
student_data = {
    "name":"Ashton",
    "age": 15,
    "grade": 8,
    "subjects": ["math", "english", "science"]
}

f = open("output.json", 'w')
json.dump(student_data, f)

输出

{“ name”:“ Ashton”,“ age”:15,“ grade”:8,“ subject”:[“ math”,“ english”,“ science”]

如上例所示,我们有一个Python字典,其中包含学生的信息,例如姓名,年龄,年级和科目。我们以写入模式打开output.json文件,然后将student_data对象转储到JSON文件中。

请考虑下表,该表显示了Python对象到JSON的转换。

你还可以使用一些参数以更漂亮的格式写入JSON数据。例如,缩进参数可以采用非负整数或字符串来指定缩进值。

如果传递0,负值或空字符串,则dump()将仅插入换行符。此外,设置“无”(默认值)可得到最紧凑的表示形式。

你还可以通过将True传递给sort_keys参数来按键对数据进行排序。默认情况下,它为False。让我们举个例子。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import json
student_data = {
    "name":"Ashton",
    "age": 15,
    "grade": 8,
    "subjects": ["math", "english", "science"]
}


f = open("output.json", 'w')
json.dump(student_data, f, indent=2, sort_keys=True)

输出

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
{
    "age": 15,
    "grade": 8,
    "name": "Ashton",
    "subjects": " [
        "math",
        "english",
        "science",
    ]
}

正如你在上面的输出中看到的那样,它更干净,更易于阅读。

将Python对象转换为JSON字符串

要将序列化的对象转换为JSON字符串,可以使用dumps()方法。它类似于dump(),不同之处在于它不需要文件对象,并且它返回包含JSON格式信息的字符串。让我们来看看。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import json
student_data = {
    "name":"Ashton",
    "age": 15,
    "grade": 8,
    "subjects": ["math", "english", "science"]
}json_string = json.dumps(student_data, indent=2, sort_keys=True)
print(json_string)
print(type(json_string))

输出

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
{
  "age": 15,
  "grade": 8,
  "name": "Ashton",
  "subjects": [
    "math",
    "english",
    "science"
  ]
}
<class 'str'

现在,让我们继续看看如何执行反序列化,即解码JSON数据。

解码JSON数据(将JSON转换为Python)

解析JSON文件

json模块提供load()方法,以将JSON从文件加载到Python对象。它需要一个类似文件的对象作为其必需参数。示例如下。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import json 
f = open('sample.json', 'r')
data = json.load(f)
print(data)
print(type(data))

输出

  •  
  •  
  •  
{'name''Ashton''age':15,'grade':8,'address':None,subject':['math','english','science']}
<class'dict'>

下表列出了从JSON到Python的转换规则。

将JSON字符串解析为对象

同样,你可以使用loads()方法将JSON字符串转换为Python对象。它使用包含JSON文档的字符串作为其必需参数。让我们来看看。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import json
json_str = '''{ 
  "name":"Ashton",
  "age":15,
  "grade":8,
  "address":null,
  "subjects":["math", "english", "science"]
}'''
data_parsed = json.loads(json_str)
print(data)
print(type(data))

输出

  •  
  •  
  •  
  •  
  •  
{'name': 'Ashton', 'age': 15, 'grade': 8, 'address': None, 'subjects':
['math', 'english', 'science']}
<class 'dict'>

在这里,json_str变量在多行字符串中包含一个JSON文档。使用loads()方法将其解析为字典。

这里要注意的另一件事是,如果先对Python对象进行序列化然后反序列化,则它不一定等于原始对象。考虑以下示例。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import json
student_data = {
    "name":"Ashton",
    "age": 15,
    "grade": 8,
    "subjects": ("math", "english", "science")
}


json_string = json.dumps(student_data, indent=2, sort_keys=True)
parsed_data = json.loads(json_string)
print(student_data==parsed_data)

输出

false

在上面的示例中,student_data包含一个关键主题,其值是元组类型。当student_data序列化为JSON字符串时,受试者的值将根据转换规则转换为数组。当我们执行解码时,它会转换为列表而不是元组。因此,原始数据和解码后的数据不相等。