JSON序列化的问题
- Python中支持JSON序列化的类型有:dict,list,tuple,string,int,float,bool,None值等,自定义对象,时间类型是不支持JSON序列化的
- 自定义对象如何实现python序列化与反序列化:
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def student2dict(std): # 对象转字典,不是类内部方法
return {
'name': std.name,
'age': std.age,
'score': std.score
}
def dict2student(d): # 字典转对象,不是类内部方法
return Student(d['name'], d['age'], d['score'])
print(json.dumps(s, default=student2dict))
json_str = '{"age": 20, "score": 88, "name": "Bob"}'
print(json.loads(json_str, object_hook=dict2student),ensure_ascii=False)
3.巧办法实现任意对象转JSON字符串:
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
print(json.dumps(s, default=lambda obj: obj.__dict__))
4.对于中文的处理:参数ensure_ascii默认情况是True,这时会把中文转成Unicode码,ensure_ascii设置成False的话就是打印中文
import json
class Student(object):
def __init__(self, name, age, score):
self.name = name
self.age = age
self.score = score
def student2dict(std): # 对象转字典,不是类内部方法
return {
'name': std.name,
'age': std.age,
'score': std.score
}
print(json.dumps(s, default=student2dict,ensure_ascii=False))
5.时间类型序列化
- 列表或者字典中的时间类型(继承json.JSONEncoder类,重写default方法,添加时间类型的处理):
import json
from datetime import datetime,date
import uuid
class CJsonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime):
return obj.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(obj, date):
return obj.strftime('%Y-%m-%d')
elif: isinstance(obj,uuid.UUID):
return str(obj)
else:
return super().default(obj)
l = ['12',date.today(),datetime.today(),uuid.uuid4()]
print(json.dumps(l, cls=CJsonEncoder))
- 对象中某些字段是时间类型:
import json
from datetime import datetime,date
class Foo(object):
def __init__(self,name,age,birth):
self.name = name
self.age = age
self.birth =birth
def obj2dict(self,obj):
return {
'name':obj.name,
'age':obj.age,
'birth':obj.birth.strftime('%Y-%m-%d')
}
f = Foo('xx',18,date.today())
json.dumps(f, default=f.obj2dict)
6.django-rest-framework框架中如何处理序列化
- 将对象转化为字典(model_to_dict方法):
import json
class Address(BaseModel):
'''地址模型类'''
receiver = models.CharField(max_length=20, verbose_name='收件人')
addr = models.CharField(max_length=256, verbose_name='收件地址')
phone = models.CharField(max_length=11, verbose_name='联系电话')
from django.forms.models import model_to_dict
addr = Assress()
addr.receiver = 'xx'
addr.addr = '北京'
addr.phone = '123456'
json.dumps(model_to_dict(addr))
- 序列化器
class Address(BaseModel):
'''地址模型类'''
receiver = models.CharField(max_length=20, verbose_name='收件人')
addr = models.CharField(max_length=256, verbose_name='收件地址')
phone = models.CharField(max_length=11, verbose_name='联系电话')
class AddressSerializer(serializers.ModelSerializer):
class Meta:
model = Address
fields = '__all__'
# 序列化
# 单个对象
addr = Assress()
addr.receiver = 'xx'
addr.addr = '北京'
addr.phone = '123456'
serializer = AddressSerializer(instance=addr)
print(serializer.data)
# 对象列表
addrs = [addr1,addr2,addr3]
serializer = AddressSerializer(instance=addrs,many=True)
print(serializer.data)
# 反序列化
for data in data_list:
serializer = AddressSerizlizer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
print(serializer.instance)