1、说明
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,采用完全独立于语言的文本格式来存储和表示数据。
而Python Json库主要用来处理JSON数据,包括以下主要功能:
-
编码(序列化)和解码(反序列化):将Python对象转换为JSON格式的字符串(编码),或者将JSON格式的字符串转换为Python对象(解码)。
-
读写JSON文件:能够读取和写入JSON格式的文件。
2、编码(序列化)
-
json.dumps()
: 将Python对象编码为JSON字符串。-
json.dumps(obj, indent=4)
: 格式化输出JSON字符串,使其易于阅读。
-
-
json.dump()
: 将Python对象编码为JSON字符串并写入文件。
import json
# 编码(序列化)
data = {'name': 'John', 'age': 30}
json_str = json.dumps(data)
with open('data.json', 'w') as file:
json.dump(data, file)
3、解码(反序列化)
-
json.loads()
: 将JSON字符串解码为Python对象。-
json.loads(s, encoding='utf-8')
: 解码JSON字符串并指定字符编码。
-
-
json.load()
: 从文件中读取JSON数据并解码为Python对象。
# 解码(反序列化)
json_str = '{"name": "John", "age": 30}'
data = json.loads(json_str)
with open('data.json', 'r') as file:
data = json.load(file)
4、序列化和反序列化的应用场景
4.1、序列化
-
数据交换:需要将数据从一个系统发送到另一个系统时,序列化为JSON格式可以确保接收系统能够正确解析这些数据,无论接收系统使用的是什么编程语言或平台。
-
持久化存储:将数据保存到文件中,以便稍后读取或分享,将数据序列化为JSON格式是一种方便且通用的方法。
-
可读性:JSON格式易于人类阅读和理解,这对于调试和记录非常有帮助。
4.2、反序列化
-
数据恢复:从文件、数据库或网络请求中接收到JSON格式的数据时,反序列化是将其转换回程序可以操作的数据结构(如字典、列表等)的必要步骤。
-
跨语言兼容性:由于JSON是一种标准格式,不同编程语言中的库都能够解析它。
-
便于处理:反序列化后的数据可以直接在程序中作为对象使用,方便进行数据操作和处理。
在实际应用中,这些操作通常与文件读写、网络通信或数据库交互等场景紧密结合。例如,一个Web服务器可能会接收到一个JSON格式的HTTP请求,服务器需要反序列化这个请求以理解客户端发送的数据,然后进行处理,最后将结果再次序列化为JSON格式发送回客户端。
5、示例
json.dumps(data)
的作用是将Python数据结构(如字典、列表等)转换为一个JSON格式的字符串。这个字符串可以在网络上进行传输,或者保存到文件中,供其他系统或程序读取。
敲黑板:序列化,得到的其实是一个“字符串”。这样子可以进行网上传输或者保存到文件。
json.loads(json_string)
的作用则是将JSON格式的字符串转换回Python的数据结构。当从网络接收到一个JSON字符串,或者从文件中读取了一个JSON字符串时,需要使用这个方法来将这个字符串转换回Python程序可以理解和操作的数据结构。
敲黑板:反序列化,得到的其实是Python的数据结构:字典或者列表式字典。这样子就可以使用Python字典或者列表式字典的方式操作这个数据,不然这就只是一个字符串而已。
示例:发送和接收JSON数据
假设我们有一个Web服务器,它接收来自客户端的JSON数据,并返回一些处理后的数据。
服务器端代码(Python Flask应用):
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/process_data', methods=['POST'])
def process_data():
# 从请求中获取JSON数据
data = request.get_json() # 这里Flask已经帮我们做了反序列化
# 假设我们只是简单地将年龄增加1岁
data['age'] += 1
# 将处理后的数据序列化为JSON字符串,并返回给客户端
return jsonify(data)
if __name__ == '__main__':
app.run(debug=True)
客户端代码(使用Python的requests库):
import requests
import json
# 准备要发送的JSON数据
data_to_send = {
'name': 'Alice',
'age': 30,
'city': 'New York'
}
# 将Python字典序列化为JSON字符串
json_data = json.dumps(data_to_send)
# 发送POST请求,并将JSON字符串作为请求体
response = requests.post('http://localhost:5000/process_data', json=data_to_send)
# 注意:在这里我们其实不需要手动序列化,因为requests库的json参数会自动处理
# 如果我们要手动序列化,需要这样做:
# response = requests.post('http://localhost:5000/process_data', data=json_data, headers={'Content-Type': 'application/json'})
# 打印服务器返回的数据(已经是JSON字符串,但requests库会帮我们反序列化为Python字典)
print(response.json())