Python3 JSON 数据解析
在 Python3 中,处理 JSON 数据非常简单,标准库 json 提供了方便的 API 来解析 JSON 格式的数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于 Web 开发和数据传输。
1. json 模块简介
Python 的 json 模块用于编码(序列化)和解码(反序列化)JSON 数据。你可以将 Python 对象转换为 JSON 格式,也可以将 JSON 格式的数据转换为 Python 对象。
2. JSON 数据解析:从字符串到 Python 对象
2.1 解析 JSON 字符串
要将 JSON 字符串解析为 Python 对象,可以使用 json.loads() 函数。它将 JSON 字符串转换为 Python 字典或其他类型。
import json
# JSON 字符串
json_data = '{"name": "Alice", "age": 30, "city": "New York"}'
# 解析 JSON 字符串
data = json.loads(json_data)
# 输出结果
print(data)
print(type(data))
输出:
{'name': 'Alice', 'age': 30, 'city': 'New York'}
<class 'dict'>
json.loads() 返回的是一个 Python 字典,你可以像操作字典一样操作解析后的数据。
2.2 解析包含数组的 JSON 字符串
JSON 中也可以包含数组。下面的例子展示了如何解析包含数组的 JSON 字符串。
import json
# JSON 字符串,包含数组
json_data = '{"name": "Bob", "age": 25, "languages": ["English", "Spanish", "French"]}'
# 解析 JSON 字符串
data = json.loads(json_data)
# 输出数据
print(data)
print(data["languages"]) # 输出数组
输出:
{'name': 'Bob', 'age': 25, 'languages': ['English', 'Spanish', 'French']}
['English', 'Spanish', 'French']
3. JSON 数据解析:从文件到 Python 对象
如果 JSON 数据保存在文件中,可以使用 json.load() 函数将 JSON 文件内容加载到 Python 对象。
3.1 从文件中解析 JSON 数据
import json
# 假设 JSON 数据保存在 'data.json' 文件中
with open('data.json', 'r') as file:
data = json.load(file)
# 输出解析后的数据
print(data)
4. JSON 数据编码:从 Python 对象到 JSON
4.1 编码 Python 对象为 JSON 字符串
你可以使用 json.dumps() 函数将 Python 对象(如字典、列表)编码为 JSON 字符串。
import json
# Python 字典
data = {"name": "Charlie", "age": 35, "city": "London"}
# 编码为 JSON 字符串
json_string = json.dumps(data)
# 输出 JSON 字符串
print(json_string)
输出:
{"name": "Charlie", "age": 35, "city": "London"}
4.2 设置 indent 美化 JSON 输出
可以使用 indent 参数来格式化输出,增加可读性。
import json
data = {"name": "Charlie", "age": 35, "city": "London"}
# 格式化输出 JSON 字符串
json_string = json.dumps(data, indent=4)
print(json_string)
输出:
{
"name": "Charlie",
"age": 35,
"city": "London"
}
4.3 控制键的排序
json.dumps() 提供了 sort_keys 参数,用于控制输出的 JSON 键的排序。
import json
data = {"name": "Charlie", "age": 35, "city": "London"}
# 按照键排序输出
json_string = json.dumps(data, indent=4, sort_keys=True)
print(json_string)
输出:
{
"age": 35,
"city": "London",
"name": "Charlie"
}
4.4 编码 Python 对象为 JSON 文件
你还可以将 Python 对象直接写入 JSON 文件。
import json
data = {"name": "Diana", "age": 40, "city": "Berlin"}
# 将 Python 对象写入 JSON 文件
with open('output.json', 'w') as file:
json.dump(data, file, indent=4)
5. JSON 与自定义对象
当 JSON 数据中包含自定义对象时,Python 默认无法直接处理这些对象。你可以通过 default 参数来指定如何处理自定义对象。
5.1 自定义对象编码
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def to_dict(self):
return {"name": self.name, "age": self.age}
# 创建自定义对象
person = Person("Eva", 28)
# 编码时使用自定义的 `to_dict` 方法
json_string = json.dumps(person, default=lambda p: p.to_dict(), indent=4)
print(json_string)
输出:
{
"name": "Eva",
"age": 28
}
5.2 自定义对象解码
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def from_dict(data):
return Person(data["name"], data["age"])
# JSON 字符串
json_data = '{"name": "Eva", "age": 28}'
# 解码 JSON 字符串并创建自定义对象
person = json.loads(json_data, object_hook=Person.from_dict)
print(person.name, person.age)
输出:
Eva 28
6. 总结
json.loads(): 用于解析 JSON 字符串为 Python 对象(如字典、列表等)。json.load(): 用于解析 JSON 文件内容为 Python 对象。json.dumps(): 用于将 Python 对象编码为 JSON 字符串。json.dump(): 用于将 Python 对象写入 JSON 文件。- 格式化输出:使用
indent参数使输出的 JSON 数据更具可读性,使用sort_keys排序键。 - 自定义对象:通过
default参数处理自定义对象的编码,使用object_hook处理自定义对象的解码。
更多详细内容请关注其他相关文章!