JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它易于人阅读和编写,同时也易于机器解析和生成。JSON 采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使得 JSON 成为理想的数据交换语言。
在 Python 中,JSON 库主要由 json 模块提供,该模块提供了将 JSON 编码为字符串以及将 JSON 字符串解码为 Python 对象的功能。
JSON 数据格式基础
JSON 支持以下数据类型:
- 数字(整数或浮点数)
- 字符串(双引号包围的文本)
- 布尔值(true 或 false)
- 数组(方括号包围的一系列值)
- 对象(花括号包围的一系列键值对)
- null
例如,下面是一个简单的 JSON 字符串:
{
"name": "John",
"age": 30,
"city": "New York",
"hasChildren": false,
"titles": ["engineer", "consultant"]
}Python 中的 JSON 模块
Python 的 json 模块提供了处理 JSON 数据的函数。以下是常用的几个函数:
json.dumps()
json.dumps() 方法用于将 Python 对象编码成 JSON 字符串。
// www.javascriptcn.com code example
import json
data = {
"name": "John",
"age": 30,
"city": "New York"
}
json_string = json.dumps(data)
print(json_string) # 输出: {"name": "John", "age": 30, "city": "New York"}json.loads()
json.loads() 方法用于将一个 JSON 字符串解码为 Python 对象。
import json
json_string = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_string)
print(data) # 输出: {'name': 'John', 'age': 30, 'city': 'New York'}处理复杂数据结构
当处理嵌套对象或数组时,可以使用相同的 json.dumps() 和 json.loads() 方法。
// www.javascriptcn.com code example
import json
data = {
"name": "John",
"age": 30,
"city": "New York",
"children": [
{"name": "Alice", "age": 5},
{"name": "Bob", "age": 7}
]
}
json_string = json.dumps(data)
print(json_string)
parsed_data = json.loads(json_string)
print(parsed_data)自定义编码和解码
有时需要自定义 JSON 的编码和解码过程。可以使用 default 参数来自定义编码过程,使用 object_hook 参数来自定义解码过程。
// www.javascriptcn.com code example
import json
class User:
def __init__(self, name, age):
self.name = name
self.age = age
def to_dict(self):
return {
"name": self.name,
"age": self.age
}
def user_decoder(obj):
if 'name' in obj and 'age' in obj:
return User(obj['name'], obj['age'])
return obj
user = User("Alice", 25)
json_string = json.dumps(user, default=lambda o: o.to_dict())
print(json_string)
decoded_user = json.loads(json_string, object_hook=user_decoder)
print(decoded_user.name, decoded_user.age) # 输出: Alice 25JSON 编码与解码中的注意事项
在处理 JSON 数据时,需要注意以下几点:
- 数据类型转换:在将 Python 对象编码为 JSON 字符串时,某些 Python 类型(如集合、元组)可能需要转换为列表或其他支持的类型。
- 日期时间处理:默认情况下,日期时间对象不能直接编码为 JSON。可以使用第三方库如
simplejson来处理这种情况。 - 编码和解码错误:在处理非标准 JSON 数据时,可能会遇到编码或解码错误。可以使用
strict=False参数来忽略这些问题。
实战示例
假设有一个 API 返回用户信息的 JSON 数据,我们需要将其解析为 Python 对象并进行处理。
// www.javascriptcn.com code example
import json
# 假设从 API 获取的 JSON 数据
api_response = """
{
"status": "success",
"data": {
"id": 1,
"name": "Alice",
"email": "alice@example.com",
"roles": ["admin", "user"]
}
}
"""
# 解析 JSON 数据
response_data = json.loads(api_response)
# 提取有用的信息
user_id = response_data["data"]["id"]
user_name = response_data["data"]["name"]
user_email = response_data["data"]["email"]
user_roles = response_data["data"]["roles"]
print(f"User ID: {user_id}")
print(f"User Name: {user_name}")
print(f"User Email: {user_email}")
print(f"User Roles: {user_roles}")通过以上示例,可以看到如何在实际项目中使用 Python 的 json 模块来解析和处理 JSON 数据。
总结
本章介绍了 Python 中 JSON 数据的解析方法,涵盖了基本的 JSON 数据格式、Python 中的 JSON 模块的使用方法、处理复杂数据结构的方法以及一些实用技巧。掌握这些知识可以帮助你在处理 JSON 数据时更加得心应手。