欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Python?中將類對象序列化為JSON

 更新時間:2022年04月06日 11:38:28   作者:sgzqc  
這篇文章主要介紹了在Python?中將類對象序列化為JSON,序列化是將對象轉(zhuǎn)換為可以在以后保存和檢索介質(zhì)中的過程,下文具體的內(nèi)容分享,需要的朋友可以參考一下

1. 引言

序列化是將對象轉(zhuǎn)換為可以在以后保存和檢索介質(zhì)中的過程。比如,將對象的當前狀態(tài)保存到文件中。對于一些復雜的項目,序列化是所有開發(fā)人員遲早要做的事情。
Python 語言的優(yōu)點之一是它在許多常見的編程任務(wù)中易于使用,往往只需幾行代碼,就可以實現(xiàn)讀取文件 IO、繪制圖表等功能,序列化在 Python 中實現(xiàn)起來也非常容易。
在本文中,我將給大家?guī)韺㈩悓ο笮蛄谢癁?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 對象轉(zhuǎn)換為 JSON。這聽起來很簡單,我們不妨來直接調(diào)用試試看。

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()? 為我們自定義對象調(diào)用相應(yīng)的編碼器,并且由于我們沒有實現(xiàn)編碼器而引發(fā)類對象錯誤。

3. 解決方案

3.1 使用 json.dumps() 和 __dict__

為了將上述類對象可以直接序列化后輸出,我們能想到的最簡單的方式就是使用內(nèi)置的 __dict__ 方法來顯示對象的內(nèi)容.

代碼如下:

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() 函數(shù)和 ?json.dumps() ?函數(shù)可以將類對象內(nèi)容以JSON格式進行輸出。

3.2 實現(xiàn) __str__ 和 __repr__

上述實現(xiàn)雖然可以實現(xiàn)序列化的目的,但是我們每次都需要調(diào)用 __dict__方法,多少有點麻煩。我們還可以有更簡單的方法,那就是實現(xiàn)類的內(nèi)置函數(shù)__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__()

調(diào)用代碼如下:

label = Label("person", 10, 10, 4, 10)
print(label)
# print(json.dumps(label))

上述代碼,print可以輸出序列化后的JSON內(nèi)容,但是json.dumps依舊不能正常工作,這是因為我們并沒有實現(xiàn)encoder。

3.3 實現(xiàn) JSON encoder

為了支持 json.dumps 用例,常用的方法是通過繼承 JSONEncoder 來實現(xiàn)自定義編碼器類。在上述例子中,由于我們希望對象是 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. 總結(jié)

本文重點介紹了在Python中,如何來將自定義對象序列化為JSON以JOSN格式進行輸出,由淺入深給出了不同的解決方案,并給出了相應(yīng)的源代碼。

到此這篇關(guān)于在Python 中將類對象序列化為JSON的文章就介紹到這了,更多相關(guān)Python 將類對象序列化JSON內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • pytorch中fuse_modules源碼解讀

    pytorch中fuse_modules源碼解讀

    這篇文章主要介紹了pytorch中fuse_modules,fuse_known_modules將給定的模塊列表mod_list中的一些常見模塊進行融合,返回融合后的模塊列表,本文通過實例代碼詳細講解,需要的朋友可以參考下
    2023-05-05
  • Python實現(xiàn)簡易的圖書管理系統(tǒng)

    Python實現(xiàn)簡易的圖書管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Python實現(xiàn)簡易的圖書管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Python干貨實戰(zhàn)之逆向登錄世界上最大的游戲平臺Stream

    Python干貨實戰(zhàn)之逆向登錄世界上最大的游戲平臺Stream

    有些網(wǎng)頁中的數(shù)據(jù)進行了算法加密 這些算法代碼是JavaScript 加密的地方就是在js文件里,我們需要破解這些算法加密 就需要了解這加密的過程 獲取加密過程中的代碼 然后進行后續(xù)的反反爬蟲操作
    2021-10-10
  • 一篇文章帶你學習Python3的高階函數(shù)

    一篇文章帶你學習Python3的高階函數(shù)

    這篇文章主要為大家詳細介紹了Python3的高階函數(shù),主要介紹什么是高階函數(shù),高階函數(shù)的用法以及幾個常見的內(nèi)置的高階函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python多線程:主線程等待所有子線程結(jié)束代碼

    Python多線程:主線程等待所有子線程結(jié)束代碼

    這篇文章主要介紹了Python多線程:主線程等待所有子線程結(jié)束代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python實現(xiàn)播放音頻和錄音功能示例代碼

    python實現(xiàn)播放音頻和錄音功能示例代碼

    這篇文章主要給大家介紹了關(guān)于python播放音頻和錄音的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • pygame實現(xiàn)簡單五子棋游戲

    pygame實現(xiàn)簡單五子棋游戲

    這篇文章主要為大家詳細介紹了pygame實現(xiàn)簡單五子棋游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下<BR>
    2022-01-01
  • python中requests小技巧

    python中requests小技巧

    Requests 使用的是 urllib3,因此繼承了它的所有特性。Requests 支持 HTTP 連接保持和連接池,支持使用 cookie 保持會話,支持文件上傳,支持自動確定響應(yīng)內(nèi)容的編碼,支持國際化的 URL 和 POST 數(shù)據(jù)自動編碼。現(xiàn)代、國際化、人性化。
    2017-05-05
  • 詳解Python中四種關(guān)系圖數(shù)據(jù)可視化的效果對比

    詳解Python中四種關(guān)系圖數(shù)據(jù)可視化的效果對比

    python關(guān)系圖的可視化主要就是用來分析一堆數(shù)據(jù)中,每一條數(shù)據(jù)的節(jié)點之間的連接關(guān)系從而更好的分析出人物或其他場景中存在的關(guān)聯(lián)關(guān)系。本文將制作四個不同的關(guān)系圖的可視化效果,感興趣的可以了解一下
    2022-11-11
  • python base64庫給用戶名或密碼加密的流程

    python base64庫給用戶名或密碼加密的流程

    這篇文章主要介紹了python base64庫給用戶名或密碼加密,需要的朋友可以參考下
    2020-01-01

最新評論