zoukankan      html  css  js  c++  java
  • json扩展之自定义序列化方式

    简介:由于json.dumps() 只能序列化Python基本数据类型,如果我们想要在数据中掺杂时间对象,或者自定义类的对象则会造成序列化数据的失败,因此json.dumps() 提供了一个属性 cls=" ",可以自定义json类,来自定制我们需要序列化对象的返回值类型,进而实现数据的格式化,下面通过一个示例来进行展示。

     1 from datetime import datetime
     2 from datetime import date
     3 import json
     4 
     5 #自定义json扩展功能类
     6 class JsonSerilize(json.JSONEncoder):
     7     def default(self, o):
     8         if isinstance(o, datetime): #如果序列化对象为datetime类型
     9             return o.strftime("%Y-%m-%d %M:%H:%S");
    10         elif isinstance(o, date):  #如果序列化对象为date类型
    11             return o.strftime("%Y-%m-%d");
    12         elif isinstance(o, User):   #如果序列化对象为User类型
    13             return o.__dict__;
    14         else:
    15             return json.JSONEncoder.default(self, o);  #如果不是上述类型,就按照json默认序列化方式操作
    16 
    17 #自定义普通类
    18 class User():
    19     def __init__(self):
    20         self.name = "kelvin"
    21         self.age = 18
    22 
    23 #测试需要的序列化数据
    24 dict = {
    25     "status": True,
    26     "date": datetime.now(),
    27     "obj":User()
    28 }
    29 
    30 #直接进行序列化,结果报错
    31 # print(json.dumps(dict)) #报错 TypeError: Object of type datetime is not JSON serializable
    32 
    33 #在dumps中使用cls=“自定义json类”,成功执行
    34 print(json.dumps(dict, cls=JsonSerilize))  # 正确执行:{"status": true, "date": "2020-03-28 21:21:50"}
    35 print(json.dumps(dict, cls=JsonSerilize))  # 正确执行:{"status": true, "date": "2020-03-28 24:21:13", "obj": {"name": "kelvin", "age": 18}}
  • 相关阅读:
    HDU3516 树的构造
    poj1160 post office
    poj1260 pearls
    POJ 3709 K-Anonymous Sequence
    HDU2829
    HDU 3480 division
    HDU3507 print artical
    HDU2490 parade
    HDU3530 子序列
    HDU3415
  • 原文地址:https://www.cnblogs.com/sun-10387834/p/12589610.html
Copyright © 2011-2022 走看看