📅  最后修改于: 2023-12-03 15:37:27.650000             🧑  作者: Mango
Python内置的JSON模块可以实现Python对象和JSON数据之间的转换。不过,当我们想要将自定义的对象转换为JSON数据或将JSON数据转换为自定义的对象时,我们需要进行额外的编码和解码。
本文将介绍如何在Python-JSON中编码和解码自定义对象。
编码自定义对象可以通过定义一个encoder
函数并使用json.dumps()
进行转换。下面是一个简单的例子:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def encode_person(obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
else:
raise TypeError('Object of type Person is not JSON serializable')
person = Person('Alex', 25)
person_json = json.dumps(person, default=encode_person)
print(person_json)
在这个例子中,我们定义了一个自定义的类Person
,然后定义了一个encoder
函数encode_person
,它将Person
对象转换为一个字典。最后,我们在json.dumps()
函数中传入encode_person
作为default
参数。
这将输出以下JSON字符串:
{"name": "Alex", "age": 25}
解码自定义对象可以通过定义一个decoder
函数并使用json.loads()
进行转换。下面是一个简单的例子:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def decode_person(obj):
if 'name' in obj and 'age' in obj:
return Person(obj['name'], obj['age'])
else:
return obj
person_json = '{"name": "Alex", "age": 25}'
person = json.loads(person_json, object_hook=decode_person)
print(person.name)
print(person.age)
在这个例子中,我们定义了一个自定义的类Person
和一个decoder
函数decode_person
,它将一个字典转换为Person
对象。最后,我们在json.loads()
函数中传入decode_person
作为object_hook
参数。
这将输出以下内容:
Alex
25
下面是一个完整的例子,它演示了如何编码和解码一个包含自定义对象的JSON字符串:
import json
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def encode_person(obj):
if isinstance(obj, Person):
return {'name': obj.name, 'age': obj.age}
else:
raise TypeError('Object of type Person is not JSON serializable')
def decode_person(obj):
if 'name' in obj and 'age' in obj:
return Person(obj['name'], obj['age'])
else:
return obj
persons = [Person('Alex', 25), Person('Bob', 30)]
persons_json = json.dumps(persons, default=encode_person)
print(persons_json)
decoded_persons = json.loads(persons_json, object_hook=decode_person)
for person in decoded_persons:
print(person.name)
print(person.age)
这将输出以下内容:
[{"name": "Alex", "age": 25}, {"name": "Bob", "age": 30}]
Alex
25
Bob
30
通过这个例子,我们可以看到如何编码和解码包含自定义对象的JSON数据。