目录
1. 引言2. 举个栗子3. 解决方案3.1 使用 json.dumps() 和 __dict__3.2 实现 __str__ 和 __repr__3.3 实现 JSON encoder4. 总结1. 引言
序列化是将对象转换为可以在以后保存和检索介质中的过程。比如,将对象的当前状态保存到文件中。对于一些复杂的项目,序列化是所有开发人员迟早要做的事情。
Python 语言的优点之一是它在许多常见的编程任务中易于使用,往往只需几行代码,就可以实现读取文件 IO、绘制图表等功能,序列化在 Python 中实现起来也非常容易。
在本文中,我将给大家带来将类对象序列化为 JSON 对象的一些技巧。
2. 举个栗子
为了讲述序列化的技巧,我们首先来定义一个类作为示例,
代码如下:
class LabelSimple: def __init__(self, label, x, y, width, height): self.label = label self.x = x self.y = y self.width = width self.height = height
如果我们想要将其序列化(比如直接打印类的对象),我们将会得到如下错误信息:
label = LabelSimple("person", 10, 10, 4, 10) print(label) >> __main__.LabelSimple object at 0x000002C3913EB2E0>
Python
中的JSON 库提供了一个方便的方法,称为json.dumps()
。它可以将任何 Python 对象转换为 JSON。这听起来很简单,我们不妨来直接调用试试看。
import json print(json.dumps(label)) >>... /usr/lib/python3.7/json/encoder.py in default(self, o) 177 178 """ --> 179 raise TypeError(f"Object of type {o.__class__.__name__} " 180 f"is not JSON serializable") 181 TypeError: Object of type LabelSimple is not JSON serializable
json.dumps()
为我们自定义对象调用相应的编码器,并且由于我们没有实现编码器而引发类对象错误。
3. 解决方案
3.1 使用 json.dumps() 和 __dict__
为了将上述类对象可以直接序列化后输出,我们能想到的最简单的方式就是使用内置的 __dict__ 方法来显示对象的内容.
代码如下:
label = Label("person", 10, 10, 4, 10) print(label.__dict__) print(json.dumps(label.__dict__))
输出如下:
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
可以看出使用上述方法后, print()函数和 json.dumps()函数可以将类对象内容以JSON格式进行输出。
3.2 实现 __str__ 和 __repr__
上述实现虽然可以实现序列化的目的,但是我们每次都需要调用 __dict__方法,多少有点麻烦。我们还可以有更简单的方法,那就是实现类的内置函数__str
和__repr__
,
代码如下:
class Label: def __init__(self, label, x, y, width, height): self.label = label self.x = x self.y = y self.width = width self.height = height def __iter__(self): yield from { "label": self.label, "x": self.x, "y": self.y, "width": self.width, "height": self.height }.items() def __str__(self): return json.dumps(dict(self), ensure_ascii=False) def __repr__(self): return self.__str__()
调用代码如下:
label = Label("person", 10, 10, 4, 10) print(label) # print(json.dumps(label))
上述代码,print可以输出序列化后的JSON内容,但是json.dumps依旧不能正常工作,这是因为我们并没有实现encoder。
3.3 实现 JSON encoder
为了支持 json.dumps 用例,常用的方法是通过继承 JSONEncoder 来实现自定义编码器类。在上述例子中,由于我们希望对象是 JSON 字典格式,所以我们只是返回字典。
代码如下:
from json import JSONEncoder class MyEncoder(JSONEncoder): def default(self, obj): return obj.__dict__ label = Label("person", 10, 10, 4, 10) print(MyEncoder().encode(label)) print(json.dumps(label, cls=MyEncoder)) print(label)
输出如下:
# outputs of a Label class object
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
{"label": "person", "x": 10, "y": 10, "width": 4, "height": 10}
4. 总结
本文重点介绍了在Python中,如何来将自定义对象序列化为JSON以JOSN格式进行输出,由浅入深给出了不同的解决方案,并给出了相应的源代码。
到此这篇关于在Python 中将类对象序列化为JSON的文章就介绍到这了,更多相关Python 将类对象序列化JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?