Python的JSON编码和解码函数,让您处理JSON数据
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是一种文本格式,易于阅读和编写。Python的JSON包含了许多函数,可用于编码(JSON序列化)和解码(JSON反序列化)数据。
在Python中,JSON数据可以是字典、列表或其他基本数据类型。JSON使用键/值对来表示数据,并使用逗号分隔不同的键/值对。以下是一个简单的JSON示例:
{
"name": "Alice",
"age": 25,
"hobbies": ["reading", "traveling"]
}
要将Python数据转换为JSON格式,可以使用 json.dumps() 函数。该函数的 个参数是要编码的对象,第二个参数是可选的,用于定义编码规则。例如:
import json
data = {
"name": "Alice",
"age": 25,
"hobbies": ["reading", "traveling"]
}
json_data = json.dumps(data)
print(json_data)
输出:
{"name": "Alice", "age": 25, "hobbies": ["reading", "traveling"]}
要将JSON格式的数据解码为Python对象,可以使用 json.loads() 函数。该函数的参数是要解码的JSON数据。例如:
import json
json_data = '{"name": "Alice", "age": 25, "hobbies": ["reading", "traveling"]}'
data = json.loads(json_data)
print(data)
输出:
{'name': 'Alice', 'age': 25, 'hobbies': ['reading', 'traveling']}
除了 json.dumps() 和 json.loads() 函数,JSON模块还提供了其他的函数和类,用于更灵活和高级的JSON解析和构建。以下是一些重要的函数和类:
1. json.dump() 和 json.load()
json.dump() 函数将Python对象编码为JSON格式,并将其写入文件对象。类似地,json.load() 函数从文件对象中读取JSON数据并解码为Python对象。例如:
import json
data = {
"name": "Alice",
"age": 25,
"hobbies": ["reading", "traveling"]
}
with open("data.json", "w") as f:
json.dump(data, f)
with open("data.json", "r") as f:
loaded_data = json.load(f)
print(loaded_data)
输出:
{'name': 'Alice', 'age': 25, 'hobbies': ['reading', 'traveling']}
2. json.JSONEncoder 和 json.JSONDecoder
json.JSONEncoder 类用于自定义JSON编码器,可以通过继承该类并重写 default() 方法来实现自定义编码器。同样地,json.JSONDecoder 类用于自定义JSON解码器,可以通过继承该类并重写 object_hook() 方法来实现自定义解码器。例如:
import json
class Employee:
def __init__(self, name, age):
self.name = name
self.age = age
class EmployeeEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, Employee):
return {"name": obj.name, "age": obj.age}
return json.JSONEncoder.default(self, obj)
class EmployeeDecoder(json.JSONDecoder):
def object_hook(self, d):
if "name" in d and "age" in d:
return Employee(d["name"], d["age"])
return d
data = {
"employee": Employee("Alice", 25)
}
# Custom Encoder
encoded_data = json.dumps(data, cls=EmployeeEncoder)
print(encoded_data)
# Custom Decoder
decoded_data = json.loads(encoded_data, cls=EmployeeDecoder)
print(decoded_data)
输出:
{"employee": {"name": "Alice", "age": 25}}
{'employee': <__main__.Employee object at 0x7f33a102b2e0>}
在这里,我们定义了一个 Employee 类,该类具有 name 和 age 属性。我们为该类创建了一个自定义编码器(EmployeeEncoder),它将 Employee 对象编码为包含 name 和 age 键的字典。同时,我们还为 Employee 对象创建了一个自定义解码器(EmployeeDecoder),它将字典解码为 Employee 对象。
3. json.JSONDecodeError
json.JSONDecodeError 类是 json.loads() 函数可能引发的异常。它包含有关解析错误的信息,如错误的位置、错误的字符和错误消息。例如:
import json
json_data = '{"name": "Alice", "age: 25, "hobbies": ["reading", "traveling"]}'
try:
data = json.loads(json_data)
except json.JSONDecodeError as e:
print("JSON Decode Error:", e.msg)
print("Error Position:", e.pos)
输出:
JSON Decode Error: Expecting property name enclosed in double quotes: line 1 column 14 (char 13) Error Position: 13
在这里,我们故意在 age 键的值处添加了一个缺失的引号。这将导致 json.loads() 函数引发 json.JSONDecodeError 异常,并包含有关解析错误的信息。
