最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在Python?中將類對(duì)象序列化為JSON

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

1. 引言

序列化是將對(duì)象轉(zhuǎn)換為可以在以后保存和檢索介質(zhì)中的過(guò)程。比如,將對(duì)象的當(dāng)前狀態(tài)保存到文件中。對(duì)于一些復(fù)雜的項(xiàng)目,序列化是所有開(kāi)發(fā)人員遲早要做的事情。
Python 語(yǔ)言的優(yōu)點(diǎn)之一是它在許多常見(jiàn)的編程任務(wù)中易于使用,往往只需幾行代碼,就可以實(shí)現(xiàn)讀取文件 IO、繪制圖表等功能,序列化在 Python 中實(shí)現(xiàn)起來(lái)也非常容易。
在本文中,我將給大家?guī)?lái)將類對(duì)象序列化為 JSON 對(duì)象的一些技巧。

2. 舉個(gè)栗子

為了講述序列化的技巧,我們首先來(lái)定義一個(gè)類作為示例,

代碼如下:

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

如果我們想要將其序列化(比如直接打印類的對(duì)象),我們將會(huì)得到如下錯(cuò)誤信息:

label = LabelSimple("person", 10, 10, 4, 10)
print(label)
>> __main__.LabelSimple object at 0x000002C3913EB2E0>

Python中的JSON 庫(kù)提供了一個(gè)方便的方法,稱為? json.dumps()? 。它可以將任何 Python 對(duì)象轉(zhuǎn)換為 JSON。這聽(tīng)起來(lái)很簡(jiǎn)單,我們不妨來(lái)直接調(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()? 為我們自定義對(duì)象調(diào)用相應(yīng)的編碼器,并且由于我們沒(méi)有實(shí)現(xiàn)編碼器而引發(fā)類對(duì)象錯(cuò)誤。

3. 解決方案

3.1 使用 json.dumps() 和 __dict__

為了將上述類對(duì)象可以直接序列化后輸出,我們能想到的最簡(jiǎn)單的方式就是使用內(nèi)置的 __dict__ 方法來(lái)顯示對(duì)象的內(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ù)可以將類對(duì)象內(nèi)容以JSON格式進(jìn)行輸出。

3.2 實(shí)現(xiàn) __str__ 和 __repr__

上述實(shí)現(xiàn)雖然可以實(shí)現(xiàn)序列化的目的,但是我們每次都需要調(diào)用 __dict__方法,多少有點(diǎn)麻煩。我們還可以有更簡(jiǎn)單的方法,那就是實(shí)現(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依舊不能正常工作,這是因?yàn)槲覀儾](méi)有實(shí)現(xiàn)encoder。

3.3 實(shí)現(xiàn) JSON encoder

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

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

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

相關(guān)文章

  • 在Python的Flask框架中實(shí)現(xiàn)單元測(cè)試的教程

    在Python的Flask框架中實(shí)現(xiàn)單元測(cè)試的教程

    這篇文章主要介紹了在Python的Flask框架中實(shí)現(xiàn)單元測(cè)試的教程,屬于自動(dòng)化部署的方面,可以給debug工作帶來(lái)諸多便利,需要的朋友可以參考下
    2015-04-04
  • python基礎(chǔ)之單分派泛函數(shù)singledispatch

    python基礎(chǔ)之單分派泛函數(shù)singledispatch

    這篇文章主要介紹了python基礎(chǔ)之單分派泛函數(shù)singledispatch問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • ipython和python區(qū)別詳解

    ipython和python區(qū)別詳解

    在本篇文章里小編給大家分享了關(guān)于ipython和python區(qū)別的相關(guān)知識(shí)點(diǎn),有興趣的朋友們跟著學(xué)習(xí)下。
    2019-06-06
  • Python線程障礙對(duì)象Barrier原理詳解

    Python線程障礙對(duì)象Barrier原理詳解

    這篇文章主要介紹了Python線程障礙對(duì)象Barrier原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python?count()函數(shù)用法詳解

    Python?count()函數(shù)用法詳解

    這篇文章主要給大家介紹了關(guān)于Python?count()函數(shù)用法的相關(guān)資料,Python?count()方法用于統(tǒng)計(jì)字符串里某個(gè)字符出現(xiàn)的次數(shù),可選參數(shù)為在字符串搜索的開(kāi)始與結(jié)束位置,需要的朋友可以參考下
    2024-02-02
  • python中的json模塊常用方法匯總

    python中的json模塊常用方法匯總

    這篇文章主要介紹了python中的json模塊常用方法匯總,json模塊可以實(shí)現(xiàn)json數(shù)據(jù)的序列化和反序列化,更多相關(guān)資料介紹需要的小伙伴可以參考一下下面文章內(nèi)容
    2022-06-06
  • Python Web版語(yǔ)音合成實(shí)例詳解

    Python Web版語(yǔ)音合成實(shí)例詳解

    這篇文章主要介紹了Python Web版語(yǔ)音合成實(shí)例詳解,語(yǔ)音合成技術(shù)能將用戶輸入的文字,轉(zhuǎn)換成流暢自然的語(yǔ)音輸出,并且可以支持語(yǔ)速、音調(diào)、音量設(shè)置,讓人機(jī)溝通更自然,需要的朋友可以參考下
    2019-07-07
  • pytorch中Transformer進(jìn)行中英文翻譯訓(xùn)練的實(shí)現(xiàn)

    pytorch中Transformer進(jìn)行中英文翻譯訓(xùn)練的實(shí)現(xiàn)

    本文主要介紹了pytorch中Transformer進(jìn)行中英文翻譯訓(xùn)練的實(shí)現(xiàn),詳細(xì)闡述了使用PyTorch實(shí)現(xiàn)Transformer模型的代碼實(shí)現(xiàn)和訓(xùn)練過(guò)程,具有一定參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • python與字符編碼問(wèn)題

    python與字符編碼問(wèn)題

    這篇文章主要介紹了python與字符編碼問(wèn)題,下面對(duì)編碼問(wèn)題做個(gè)簡(jiǎn)單的總結(jié),感興趣的朋友跟隨小編一起看看吧
    2019-05-05
  • 如何基于Django實(shí)現(xiàn)上下文章跳轉(zhuǎn)

    如何基于Django實(shí)現(xiàn)上下文章跳轉(zhuǎn)

    這篇文章主要介紹了如何基于Django實(shí)現(xiàn)上下文章跳轉(zhuǎn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

同仁县| 阜平县| 广南县| 饶阳县| 明水县| 宿迁市| 营山县| 南汇区| 平顺县| 洛南县| 洛川县| 安多县| 哈尔滨市| 南乐县| 伽师县| 泰兴市| 金门县| 繁昌县| 贵州省| 德令哈市| 进贤县| 靖西县| 千阳县| 迭部县| 景谷| 措美县| 都安| 高州市| 榆树市| 永新县| 齐河县| 吉水县| 民丰县| 宜宾县| 达日县| 蕲春县| 黎川县| 洛宁县| 西吉县| 禹城市| 称多县|