📜  在 Python-JSON 中编码和解码自定义对象(1)

📅  最后修改于: 2023-12-03 15:37:27.650000             🧑  作者: Mango

在 Python-JSON 中编码和解码自定义对象

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数据。