Python中的JSON序列化问题

JSON序列化的问题

  1. Python中支持JSON序列化的类型有:dict,list,tuple,string,int,float,bool,None值等,自定义对象,时间类型是不支持JSON序列化的
  2. 自定义对象如何实现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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值