当前位置: 首页 > news >正文

Python类实例的json

web开发中有这么一个场景,我们从数据库中查询某一数据的时候,往往需要对数据进行一些转化之后才能传给前端。

当然我们可以根据查询出来的实例对象,构建一个dict返回,这样会导致我们的代码非常的臃肿。但是这也确实是一种最直接的方式。

除此之外我们来看另外一种方式。

调用类的__dict__函数将类的一些属性转化字典进行序列化

import json
class UserTest:# 类变量name = "hou"age = 18# 实例变量def __init__(self):self.nickname = "user1"user = UserTest()
print(json.dumps(user))
# 直接序列化一个对象是会报错的
# TypeError: Object of type UserTest is not JSON serializabledct = user.__dict__
print(json.dumps(dct))
{"nickname": "user1"}

此时你会看到类变量通过__dict__函数是不会被转化字典从而被序列化的。

如果我们想要将类变量也转化为字典从而被序列化那要怎么办呢?
此时你需要重写这两个函数def keys(self)def __getitem__(self, item)

class User:name = "hou"age = 18def __init__(self):self.nickname = "user1"def keys(self):# keys函数可以通过dict(self)返回对象构建字典的key集合# 重写keys函数,类的属性也可以通过dict的形式进行访问# 返回值必须是一个可迭代的对象return ("name", "age", "nickname")def __getitem__(self, item):# 根据item获取对象属性的值return getattr(self, item)user = User()
print(user.name) # 对象.属性访问
print(user["name"]) # 字典形式访问
print(user["age"])
print(user["nickname"])# dict在传入对象实例的时候会尝试构建字典
# 通过对象的keys获取对象的键值,__getitem__获取对象属性的值
dct = dict(user)
print(dct)
# {'name': 'hou', 'age': 18, 'nickname': 'user1'}

此时还有一个问题,如果我们只想通过dict(对象)返回特定的属性如何操作呢?
此时只要在keys函数中指定返回的集合即可。

class User:name = "hou"age = 18def __init__(self):self.nickname = "user1"def keys(self):return ("name", "nickname")def __getitem__(self, item):return getattr(self, item)user = User()
dct = dict(user)
print(dct)
# {'name': 'hou', 'nickname': 'user1'}

如果一个类的属性比较多,我们只想根据传参的集合来构架字典从而序列化如何做呢?
我们只需要在类实例化的时候指定keys需要返回的字段即可。

class User:name = "hou"age = 18def __init__(self):self.nickname1 = "user1"self.nickname2 = "user2"self.nickname3 = "user3"self.nickname4 = "user4"self.nickname5 = "user5"# self.fields = ["name", "age", "nickname1", "nickname2", "nickname3", "nickname4", "nickname5"]self.fields = []def keys(self):return self.fieldsdef __getitem__(self, item):return getattr(self, item)def to_dict(self, *keys):for key in keys:self.fields.append(key)user = User()
user.to_dict("nickname1", "nickname3")
dct = dict(user)
print(dct)
# {'nickname1': 'user1', 'nickname3': 'user3'}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微信小程序写一个可以滚动虚拟列表(瀑布流),减少dom渲染的优化,解决内存问题。
  • 使用 HTTPS 已成为网站的标配了
  • 二叉树的链式结构
  • 关于忠诚:忠于自己的良知、理想、信念
  • bash条件判断基础adsawq1`1nn
  • 七大排序-冒泡排序,插入排序,希尔排序(一)
  • ffmpeg 安装 h264(x264)encoder
  • 哈喽GPT-4o,对GPT-4o 论文速写的思考与探索
  • css 选择器汇总
  • 普中51单片机:数码管显示原理与实现详解(四)
  • 在本地运行React集成TypeScript的项目
  • BulingBuling - 作息安排 [Reset Your Routine] - 1
  • 【初阶数据结构】深入解析循环队列:探索底层逻辑
  • 深度学习与CV入门
  • 中国科学技术大学发布了2024年少年班录取名单
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • DataBase in Android
  • java8-模拟hadoop
  • Python实现BT种子转化为磁力链接【实战】
  • uva 10370 Above Average
  • Wamp集成环境 添加PHP的新版本
  • web标准化(下)
  • 读懂package.json -- 依赖管理
  • 高性能JavaScript阅读简记(三)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 从如何停掉 Promise 链说起
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #、%和$符号在OGNL表达式中经常出现
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #QT(QCharts绘制曲线)
  • (04)odoo视图操作
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (C语言)fgets与fputs函数详解
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (实战篇)如何缓存数据
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转载)CentOS查看系统信息|CentOS查看命令
  • . NET自动找可写目录
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .Net Core与存储过程(一)
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .Net中的设计模式——Factory Method模式
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [04]Web前端进阶—JS伪数组
  • [1127]图形打印 sdutOJ
  • [1525]字符统计2 (哈希)SDUT
  • [Android学习笔记]ScrollView的使用