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

將Python數(shù)據(jù)類(lèi)轉(zhuǎn)換為JSON的三種方法

 更新時(shí)間:2026年01月18日 14:05:08   作者:數(shù)研小生  
這篇文章主要介紹了在 Python 中把數(shù)據(jù)類(lèi)(dataclass)以?xún)?yōu)雅、規(guī)范的方式轉(zhuǎn)換成 JSON 格式的方法,這是數(shù)據(jù)處理場(chǎng)景中非常實(shí)用的需求,尤其貼合你作為數(shù)據(jù)服務(wù)商的技術(shù)工作場(chǎng)景,需要的朋友可以參考下

文章介紹在 Python 中把數(shù)據(jù)類(lèi)(dataclass)以?xún)?yōu)雅、規(guī)范的方式轉(zhuǎn)換成 JSON 格式的方法,這是數(shù)據(jù)處理場(chǎng)景中非常實(shí)用的需求,尤其貼合你作為數(shù)據(jù)服務(wù)商的技術(shù)工作場(chǎng)景。

Python 內(nèi)置的json模塊默認(rèn)無(wú)法直接序列化dataclass實(shí)例,下面我會(huì)提供三種從基礎(chǔ)到進(jìn)階的優(yōu)雅方案,覆蓋簡(jiǎn)單場(chǎng)景、復(fù)用場(chǎng)景和生產(chǎn)級(jí)場(chǎng)景,代碼可直接復(fù)制使用。

方法 1:基礎(chǔ)優(yōu)雅方案(dataclasses.asdict + json.dumps)

這是官方推薦的基礎(chǔ)方案,通過(guò)dataclasses.asdict()將數(shù)據(jù)類(lèi)實(shí)例轉(zhuǎn)為字典,再用json.dumps()序列化,適合簡(jiǎn)單的非嵌套數(shù)據(jù)類(lèi)。

import json
from dataclasses import dataclass, asdict
 
# 定義你的數(shù)據(jù)類(lèi)(貼合數(shù)據(jù)服務(wù)場(chǎng)景:比如電商數(shù)據(jù)接口的返回?cái)?shù)據(jù))
@dataclass
class EcommerceData:
    order_id: str          # 訂單ID
    user_id: int           # 用戶(hù)ID
    amount: float          # 訂單金額
    is_paid: bool          # 是否支付
 
# 創(chuàng)建數(shù)據(jù)類(lèi)實(shí)例
data_instance = EcommerceData(
    order_id="ORD20260113001",
    user_id=10086,
    amount=299.99,
    is_paid=True
)
 
# 優(yōu)雅轉(zhuǎn)換為JSON
# 步驟1:轉(zhuǎn)字典 → 步驟2:序列化為JSON字符串(ensure_ascii=False支持中文,indent美化格式)
json_str = json.dumps(asdict(data_instance), ensure_ascii=False, indent=2)
 
# 輸出結(jié)果
print(json_str)

輸出結(jié)果

{
  "order_id": "ORD20260113001",
  "user_id": 10086,
  "amount": 299.99,
  "is_paid": true
}

關(guān)鍵解釋

  • asdict(data_instance):將 dataclass 實(shí)例轉(zhuǎn)為嵌套字典(支持嵌套 dataclass);
  • json.dumps()indent=2讓 JSON 格式更優(yōu)雅,ensure_ascii=False避免中文被轉(zhuǎn)義(數(shù)據(jù)服務(wù)中常處理中文數(shù)據(jù))。

方法 2:復(fù)用性更強(qiáng)的方案(自定義 JSON 編碼器)

如果需要多次序列化 dataclass,自定義JSONEncoder子類(lèi)是更優(yōu)雅的方式,無(wú)需每次手動(dòng)調(diào)用asdict()。

import json
from dataclasses import dataclass, is_dataclass, asdict
 
# 自定義JSON編碼器(自動(dòng)識(shí)別dataclass并轉(zhuǎn)換)
class DataClassJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        # 如果是dataclass實(shí)例,自動(dòng)轉(zhuǎn)字典
        if is_dataclass(obj):
            return asdict(obj)
        # 其他類(lèi)型沿用默認(rèn)序列化邏輯
        return super().default(obj)
 
# 定義數(shù)據(jù)類(lèi)(嵌套場(chǎng)景,更貼近真實(shí)數(shù)據(jù)服務(wù))
@dataclass
class UserInfo:
    name: str
    phone: str
 
@dataclass
class OrderData:
    order_id: str
    user: UserInfo  # 嵌套dataclass
    total: float
 
# 創(chuàng)建嵌套數(shù)據(jù)實(shí)例
nested_data = OrderData(
    order_id="ORD20260113002",
    user=UserInfo(name="張三", phone="13800138000"),
    total=599.0
)
 
# 直接序列化(指定自定義編碼器,無(wú)需手動(dòng)轉(zhuǎn)字典)
json_str = json.dumps(
    nested_data,
    cls=DataClassJSONEncoder,  # 核心:指定自定義編碼器
    ensure_ascii=False,
    indent=2
)
 
print(json_str)

輸出結(jié)果

{
  "order_id": "ORD20260113002",
  "user": {
    "name": "張三",
    "phone": "13800138000"
  },
  "total": 599.0
}

關(guān)鍵解釋

  • 重寫(xiě)JSONEncoderdefault方法,自動(dòng)識(shí)別 dataclass 實(shí)例并轉(zhuǎn)換;
  • 支持嵌套 dataclass,更貼合數(shù)據(jù)服務(wù)中復(fù)雜數(shù)據(jù)結(jié)構(gòu)的場(chǎng)景;
  • 一次定義,多處復(fù)用,代碼更簡(jiǎn)潔優(yōu)雅。

方法 3:生產(chǎn)級(jí)優(yōu)雅方案(使用 pydantic,推薦)

作為數(shù)據(jù)服務(wù)商,推薦使用pydantic庫(kù)(數(shù)據(jù)校驗(yàn) + JSON 序列化一體化),它的dataclass不僅支持一鍵轉(zhuǎn) JSON,還能自動(dòng)校驗(yàn)數(shù)據(jù)類(lèi)型,避免臟數(shù)據(jù),是生產(chǎn)環(huán)境的首選。

步驟 1:安裝 pydantic

pip install pydantic 

步驟 2:代碼實(shí)現(xiàn)

from pydantic.dataclasses import dataclass  # 注意:是pydantic的dataclass
 
# 定義帶數(shù)據(jù)校驗(yàn)的dataclass(數(shù)據(jù)服務(wù)核心需求:數(shù)據(jù)合法性)
@dataclass
class DataServiceResponse:
    code: int               # 狀態(tài)碼(必須是int)
    msg: str                # 提示信息(必須是str)
    data: dict              # 業(yè)務(wù)數(shù)據(jù)(必須是dict)
    timestamp: float = 0.0  # 時(shí)間戳(可選,默認(rèn)0.0)
 
# 創(chuàng)建實(shí)例
response = DataServiceResponse(
    code=200,
    msg="請(qǐng)求成功",
    data={"order_count": 100, "total_amount": 29999.5},
    timestamp=1736764800.0
)
 
# 一鍵優(yōu)雅轉(zhuǎn)JSON(無(wú)需額外處理,自帶格式化)
json_str = response.model_dump_json(indent=2, ensure_ascii=False)
 
print(json_str)

輸出結(jié)果

{
  "code": 200,
  "msg": "請(qǐng)求成功",
  "data": {
    "order_count": 100,
    "total_amount": 29999.5
  },
  "timestamp": 1736764800.0
}

關(guān)鍵解釋

  • pydantic.dataclass:自帶數(shù)據(jù)類(lèi)型校驗(yàn)(比如傳入code="200"會(huì)直接報(bào)錯(cuò),避免數(shù)據(jù)類(lèi)型錯(cuò)誤);
  • model_dump_json():一鍵序列化,無(wú)需手動(dòng)轉(zhuǎn)字典,支持嵌套、默認(rèn)值、中文等;
  • 貼合數(shù)據(jù)服務(wù)商的核心需求:數(shù)據(jù)校驗(yàn) + JSON 序列化一體化,減少冗余代碼。

總結(jié)

  1. 核心思路:Python dataclass 轉(zhuǎn) JSON 的關(guān)鍵是先將實(shí)例轉(zhuǎn)為可序列化的字典(或 pydantic 結(jié)構(gòu)化數(shù)據(jù)),再進(jìn)行 JSON 序列化;
  2. 場(chǎng)景選擇:簡(jiǎn)單場(chǎng)景用asdict()+json.dumps,復(fù)用場(chǎng)景用自定義JSONEncoder,生產(chǎn)環(huán)境優(yōu)先用pydantic(兼顧校驗(yàn)和序列化);
  3. 數(shù)據(jù)服務(wù)適配pydantic方案不僅優(yōu)雅,還能校驗(yàn)數(shù)據(jù)合法性,是數(shù)據(jù)服務(wù)商處理接口返回、數(shù)據(jù)傳輸?shù)淖顑?yōu)選擇。

以上就是將Python數(shù)據(jù)類(lèi)轉(zhuǎn)換為JSON的三種方法的詳細(xì)內(nèi)容,更多關(guān)于Python數(shù)據(jù)類(lèi)轉(zhuǎn)換為JSON的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 在Django中Pyecharts生成圖表實(shí)現(xiàn)

    在Django中Pyecharts生成圖表實(shí)現(xiàn)

    pyecharts是支持python的一種可視化,那么在Django中Pyecharts如何生成圖表,主要有兩種方法,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python字符串len()、split()、join()深度解析

    Python字符串len()、split()、join()深度解析

    在Python的字符串江湖中,len()、split()、join()三大方法如同倚天劍、屠龍刀、玄鐵重劍,看似簡(jiǎn)單卻暗藏玄機(jī),本文將通過(guò)實(shí)戰(zhàn)案例,帶您領(lǐng)略這些方法的精妙之處,需要的朋友可以參考下
    2025-04-04
  • Python和JS反爬之解決反爬參數(shù)?signKey

    Python和JS反爬之解決反爬參數(shù)?signKey

    這篇文章主要介紹了Python和JS反爬之解決反爬參數(shù)?signKey,Python?反爬中有一大類(lèi),叫做字體反爬,核心的理論就是通過(guò)字體文件或者?CSS?偏移,接下來(lái)文章的詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • 在python中路徑含有空格的問(wèn)題及解決

    在python中路徑含有空格的問(wèn)題及解決

    這篇文章主要介紹了在python中路徑含有空格的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python @propert裝飾器使用方法原理解析

    python @propert裝飾器使用方法原理解析

    這篇文章主要介紹了python @propert裝飾器使用方法原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python代碼打包為exe的六種主流方法及避坑指南

    Python代碼打包為exe的六種主流方法及避坑指南

    在 Python 開(kāi)發(fā)中,我們常遇到這樣的需求:將寫(xiě)好的腳本分享給他人,但對(duì)方?jīng)]有安裝 Python 環(huán)境,也不懂如何配置依賴(lài),此時(shí),將 Python 代碼打包成exe就成了最佳解決方案,本文將詳細(xì)講解 6 種主流的 Python 打包工具,需要的朋友可以參考下
    2025-11-11
  • 一文講清Python中文件路徑的基本概念與操作方法

    一文講清Python中文件路徑的基本概念與操作方法

    這篇文章主要為大家詳細(xì)介紹了Python中文件路徑的基本概念與操作方法,其中文件路徑主要分為絕對(duì)路徑(從根目錄開(kāi)始)和相對(duì)路徑(相對(duì)于當(dāng)前工作目錄),感興趣的小伙伴可以了解下
    2026-04-04
  • python解決js文件utf-8編碼亂碼問(wèn)題(推薦)

    python解決js文件utf-8編碼亂碼問(wèn)題(推薦)

    這篇文章主要介紹了python解決js文件utf-8編碼亂碼問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-05-05
  • Python獲取excel內(nèi)容及相關(guān)操作代碼實(shí)例

    Python獲取excel內(nèi)容及相關(guān)操作代碼實(shí)例

    這篇文章主要介紹了Python獲取excel內(nèi)容及相關(guān)操作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Python繪制數(shù)據(jù)動(dòng)態(tài)圖的方法詳解

    Python繪制數(shù)據(jù)動(dòng)態(tài)圖的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用Python語(yǔ)言繪制好看的數(shù)據(jù)動(dòng)態(tài)圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下
    2022-07-07

最新評(píng)論

马关县| 和田市| 东光县| 云浮市| 凌海市| 奇台县| 华坪县| 天气| 桃源县| 公主岭市| 晋城| 遂平县| 龙口市| 望城县| 新乐市| 营口市| 衡东县| 司法| 金湖县| 特克斯县| 台江县| 鄢陵县| 缙云县| 安乡县| 上杭县| 桐柏县| 六安市| 东乌珠穆沁旗| 革吉县| 寿阳县| 元阳县| 封丘县| 城固县| 通城县| 赫章县| 乌兰察布市| 沽源县| 常德市| 新绛县| 安国市| 通辽市|